Рисуем круг через три точки в C#
Перпендикулярная биссектриса любой хорды на круге проходит через центр круга. Чтобы найти центр, заданный тремя точками, просто найдите перпендикулярные биссектрисы первых двух и последних двух пар точек и посмотрите, где пересекаются биссектрисы. После того, как вы найдете центр, вычислите расстояние от центра до одной из точек, чтобы получить радиус круга.
Если биссектрисы не пересекаются, три точки являются коллинеарными, поэтому они не определяют круг.
Следующий код показывает, как программа находит круг, определенный тремя точками.
// Найдите круг через три точки. private void FindCircle(PointF a, PointF b, PointF c, out PointF center, out float radius) { // Получим перпендикулярный биссектритель (x1, y1) и (x2, y2). float x1 = (b.X + a.X) / 2; float y1 = (b.Y + a.Y) / 2; float dy1 = b.X - a.X; float dx1 = -(b.Y - a.Y); // Получим перпендикулярный биссектритель (x2, y2) и (x3, y3). float x2 = (c.X + b.X) / 2; float y2 = (c.Y + b.Y) / 2; float dy2 = c.X - b.X; float dx2 = -(c.Y - b.Y); // Смотрите, где пересекаются линии. bool lines_intersect, segments_intersect; PointF intersection, close1, close2; FindIntersection( new PointF(x1, y1), new PointF(x1 + dx1, y1 + dy1), new PointF(x2, y2), new PointF(x2 + dx2, y2 + dy2), out lines_intersect, out segments_intersect, out intersection, out close1, out close2); if (!lines_intersect) { MessageBox.Show("The points are colinear"); center = new PointF(0, 0); radius = 0; } else { center = intersection; float dx = center.X - a.X; float dy = center.Y - a.Y; radius = (float)Math.Sqrt(dx * dx + dy * dy); } }
Этот код вычисляет точку (x1, y1) на полпути между двумя первыми точками. Затем он вычисляет вектор & lt; dx1, dy1 & gt; указывая в направлении перпендикулярной биссектрисы для этих точек. Он повторяет эти шаги, чтобы найти перпендикулярную биссектрису второй и третьей точек.
Затем программа использует метод FindIntersection, описанный в сообщении Определите, где две линии пересекаются в C# , чтобы увидеть, где пересекаются два биссектрисы. Р>