Дуга рисования C# с 3 точками

Я должен привлечь использование дуги GraphicsPath и наличие начальной буквы, средних и конечных пунктов. Дуга должна передать их.

Я попробовал.DrawCurve и.DrawBezier, но результатом не является точно дуга.

Что я могу сделать?

РЕШЕНИЕ:

После нескольких часов кода, пишущий мне удалось потянуть то, что я хотел с этим алгоритмом (дайте 3 Точки a, b, c и путь GraphicsPath):

double d = 2 * (a.X - c.X) * (c.Y - b.Y) + 2 * (b.X - c.X) * (a.Y - c.Y);
double m1 = (Math.Pow(a.X, 2) - Math.Pow(c.X, 2) + Math.Pow(a.Y, 2) - Math.Pow(c.Y, 2));
double m2 = (Math.Pow(c.X, 2) - Math.Pow(b.X, 2) + Math.Pow(c.Y, 2) - Math.Pow(b.Y, 2));
double nx = m1 * (c.Y - b.Y) + m2 * (c.Y - a.Y);
double ny = m1 * (b.X - c.X) + m2 * (a.X - c.X);
double cx = nx / d;
double cy = ny / d;
double dx = cx - a.X;
double dy = cy - a.Y;
double distance = Math.Sqrt(dx * dx + dy * dy);
Vector va = new Vector(a.X - cx, a.Y - cy);
Vector vb = new Vector(b.X - cx, b.Y - cy);
Vector vc = new Vector(c.X - cx, c.Y - cy);
Vector xaxis = new Vector(1, 0);
float startAngle = (float)Vector.AngleBetween(xaxis, va);
float sweepAngle = (float)(Vector.AngleBetween(va, vb) + Vector.AngleBetween(vb, vc));
path.AddArc(
    (float)(cx - distance), (float)(cy - distance),
    (float)(distance * 2), (float)(distance * 2), 
    startAngle, sweepAngle);
11
задан Johannes Rudolph 13 August 2011 в 05:33
поделиться

2 ответа

I будет использовать DrawArc () , как было предложено ANC_Michael. Чтобы найти дугу, проходящую через 3 точки, необходимо вычислить описанную окружность треугольника, образованного точками.

После получения описанной окружности вычислите ограничивающую рамку для круга, который будет использоваться с DrawArc , используя минимальные / максимальные размеры (центр +/- радиус). Теперь вычислите начальный и конечный углы, переведя точки так, чтобы описанная окружность была центрирована в начале координат (перевести с помощью -circumcenter), и возьмите скалярное произведение нормализованных начального и конечного векторов с осью X:

double startAngle = Math.Acos(VectorToLeftPoint.Dot(XAxis));
double stopAngle = Math.Acos(VectorToRightPoint.Dot(XAxis));

Обратите внимание, что DrawArc ожидает углы по часовой стрелке от оси X, поэтому следует добавить Math.PI , если вычисленный вектор находится выше оси x. Этой информации должно быть достаточно для вызова DrawArc () .

Изменить: этот метод найдет дугу окружности и не обязательно дугу «наилучшего соответствия» в зависимости от ожидаемого поведения конечной точки.

7
ответ дан 3 December 2019 в 10:43
поделиться

Вы пробовали метод DrawArc и смотрели, можете ли вы каким-то образом манипулировать своими 3 точками?

возможно

Pen blackPen= new Pen(Color.Black, 3);
// Create rectangle to bound ellipse.
Rectangle rect = new Rectangle(initial x, initial y, final x, median y);
// Create start and sweep angles on ellipse.
float startAngle =  0F;
float sweepAngle = 270.0F;
// Draw arc to screen.
e.Graphics.DrawArc(blackPen, rect, startAngle, sweepAngle);

http://msdn.microsoft.com/en-us/library/system.drawing.graphics.drawarc%28VS.71%29.aspx

1
ответ дан 3 December 2019 в 10:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: