#c# #draw #system.drawing #drawimage
#c# #нарисуйте #system.drawing #нарисуйте изображение
Вопрос:
мне нужно сгенерировать новый метод для заполнения треугольника в приведенном ниже коде и вызвать его отдельно, какие-либо рекомендации, пожалуйста?
public void draw(Graphics g, Pen blackPen)
{
double xDiff, yDiff, xMid, yMid;
xDiff = oppPt.X - keyPt.X;
yDiff = oppPt.Y - keyPt.Y;
xMid = (oppPt.X keyPt.X) / 2;
yMid = (oppPt.Y keyPt.Y) / 2;
// draw triangle
g.DrawLine(blackPen, (int)keyPt.X, (int)keyPt.Y, (int)(xMid yDiff / 2), (int)(yMid - xDiff / 2));
g.DrawLine(blackPen, (int)(xMid yDiff / 2), (int)(yMid - xDiff / 2), (int)oppPt.X, (int)oppPt.Y);
g.DrawLine(blackPen, (int)keyPt.X, (int)keyPt.Y, oppPt.X, oppPt.Y);
}
метод должен принимать оба этих аргумента
public void fillTriangle(Graphics g, Brush redBrush)
{
}
Комментарии:
1. Есть
FillPolygon
, насколько я помню… Многоугольник с 3 точками является треугольником.2. Вам нужно будет создать drawPolygon , а затем заполнить его с помощью fillPolygon .
3. @Fildor итак, вам нужно сохранить нарисованные линии в массив, а затем передать его в качестве второго аргумента fillpolygon ?
4. Треугольник — это многоугольник, ограниченный тремя точками. Используйте
Graphics.FillPolygon()
для заполнения фигуры. ИлиGraphicsPath.AddPolygon()
. С помощьюGraphicsPath
вы также можете нарисовать 3 линии, затем вызвать.CloseFigure()
, затемGraphics.FillPath()
.5. а) сохраните 3 точки в трехточечных переменных!!! б) составьте из них список <Точка>!! c) вызовите drawPolygon и d) передайте список в вашу функцию fillTriangle, где вы используете fillPolygon!
Ответ №1:
Используйте единственную функцию для рисования, а для уменьшения сложности и согласованности используйте GraphicsPath
объект.
void DrawGraphics(Graphics g, Pen pen, Brush brush)
{
float xDiff=oppPt.X-keyPt.X;
float yDiff=oppPt.Y-keyPt.Y;
float xMid=(oppPt.X keyPt.X)/2;
float yMid=(oppPt.Y keyPt.Y)/2;
// Define path with the geometry information only
var path = new GraphicsPath();
path.AddLines(new PointF[] {
keyPt,
new PointF(xMid yDiff/2, yMid-xDiff/2),
oppPt,
});
path.CloseFigure();
// Fill Triangle
g.FillPath(brush, path);
// Draw Triangle
g.DrawPath(pen, path);
}
Результат, как показано ниже:
Ответ №2:
Вам просто нужно создать массив с точками, после этого настроить способ заливки, а затем да нарисовать, FillPolygon
который является объектом, для DrawPolygon
которого является просто контуром.
public void draw(Pen blackPen)
{
Graphics draw = CreateGraphics();
Point[] points = new Point[6];
points[0].X = 0;
points[0].Y = 0;
points[1].X = 150;
points[1].Y = 150;
points[2].X = 0;
points[2].Y = 150;
using (SolidBrush fillvar = new SolidBrush(Color.FromArgb(100, Color.Yellow)))
{
draw.FillPolygon(fillvar, points.ToArray());
draw.DrawPolygon(Pens.DarkBlue, points);
}
}
Если вы хотите нарисовать FillPolygon
внутри чего-либо, как в случае с PictureBox
, вам просто нужно присвоить это Graphics draw
.
Graphics draw = picturebox.CreateGraphics();
Выше приведена лишь практическая иллюстрация того, как это работает, взгляните на свой код. Не хватает только реализации его координат xDiff, yiff, xMid, yMid.
public void draw(Graphics g, Pen blackPen)
{
double xDiff, yDiff, xMid, yMid;
Point[] points = new Point[6];
points[0].X = 50;
points[0].Y = 50;
points[1].X = 150;
points[1].Y = 150;
points[2].X = 0;
points[2].Y = 150;
SolidBrush varbrush = new SolidBrush(Color.FromArgb(100, Color.Yellow));
fillTriangle(g, varbrush, points);
}
Вам нужно будет передать точки в fillTriangle и нарисовать их этим методом.
public void fillTriangle(Graphics g, Brush varbrush, Point[] points)
{
g.FillPolygon(varbrush, points.ToArray());
g.DrawPolygon(Pens.Red, points);
}
Комментарии:
1. Пожалуйста, удалите эти вещи:
Graphics draw = CreateGraphics();
иGraphics draw = picturebox.CreateGraphics();
. Для рисования на его поверхности необходимо использовать событие Paint элемента управления. Если вы не знаете почему, сверните форму и снова нормализуйте ее.2. @Alberto Santos дело в том, что заполнение должно выполняться другим методом, поэтому я могу вызвать его где-нибудь еще, основываясь на выборе пользователя