Я рисую рисунок в области рисования.
Чтобы оптимизировать производительность этого чертежа, я решил перерисовать только внутри действительно необходимой области (области отсечения). Смотрите картинку.
Проблема в том, что я не прибегаю к созданию метода (GetBitmapFromRectangle
), который возвращает мне результат пересечения моих путей с отсеченным прямоугольником.
Этот метод может быть очень полезен, когда пользователь перемещает (с помощью мыши) пути. В этом случае необходимо перерисовать только прежнюю и текущую перемещенную область пути, а не всю картинку, что в случае сложных картинок может заметно замедлить работу приложения.
Мои тесты показывают, что время вычислений гораздо менее важно, чем время рисования, поэтому мне лучше выполнить больше вычислений, чем больше рисования.
Я хочу нарисовать не все пути, которые пересекают прямоугольник, а на самом деле только пути внутри области отсечения.
альтернативный текст http://lh5.ggpht.com/_1TPOP7DzY1E/TD7T0jNU-wI/AAAAAAAADUM/YxaQu4hANpU/s800/Capture1.gif
Другими словами, мне нужен метод, который сделает СИНИЕ линии внутри красной области PINK .
Вот код:
using System.Drawing;
using System.Windows.Forms;
namespace WindowsApplication38
{
public partial class Form1 : Form
{
Point center;
int radius, penWidth;
public Form1()
{
InitializeComponent();
center = new Point(50, 50);
radius = 100;
penWidth = 5;
this.ResizeRedraw = true;
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
e.Graphics.Clear(this.BackColor);
e.Graphics.DrawImage(
GetBitmapFromRectangle(e.ClipRectangle),
e.ClipRectangle.Location);
//
// INITIAL DRAWING METHOD
//
Pen p = new Pen(Color.Blue, penWidth);
// draw O
e.Graphics.DrawEllipse(p, center.X - radius, center.Y - radius, radius * 2, radius * 2);
// draw X
Point[] line1 = new Point[] { new Point(0, 0), new Point(this.Width, this.Height) };
Point[] line2 = new Point[] { new Point(this.Width, 0), new Point(0, this.Height) };
e.Graphics.DrawLines(p, line1);
e.Graphics.DrawLines(p, line2);
p.Dispose();
}
private Bitmap GetBitmapFromRectangle(Rectangle rect)
{
Bitmap bmp = new Bitmap(rect.Width, rect.Height);
Graphics g = Graphics.FromImage(bmp);
if (rect != this.DisplayRectangle)
g.Clear(Color.Red);
else
g.Clear(this.BackColor);
// Draw ONLY! the intersetion between drawing and rectangle...
// How to ???
return bmp;
}
}
}
Nota bene
Пример является примером только для демонстрации. В реальном проекте у меня очень сложная графика, а время рисования намного дороже, чем расчетное. Вот почему я хочу не перерисовывать всю картину, а только линии внутри области отсечения!