Цитата:
Сообщение от VASSUV
Добрый день, Уважаемые,
На самом деле у меня не окружность, а дуга. Известны начальная и конечная точка, и коэффициент кривизны, т.е. тангенс четверти угла стянутого дуговым сегментом.
Четверть угла лишь для того чтобы тангенс необрывался если модуль угла больше Пи/2
А тангенс нужен для того что бы определить в какую сторону дуга выпуклая от отрезка соединяющего те две точки.
Далее код нахождения центра дуги
C# | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
| Point a = new Point(4, 1);
Point b = new Point(8, 3);
// Тангенс четверти угла стянутого дуговым сегментом
double bulge = 2.414213562373094;
// Угол стянутый дуговым сегментом
double L = Math.Atan(bulge) * 4;
// Для отрезка соединяющего начальну и конечную точки дуги
double AB = Math.Sqrt(Math.Pow(a.X - b.X, 2.0) + Math.Pow(a.Y - b.Y, 2.0));
// Радиус кривизны дуги
double R = AB / (Math.Sqrt(2 - 2 * Math.Cos(L)));
// Растояние от АВ до Центра окружности
double h = R - AB * bulge;
// Координаты вектора AB
double ABx = b.X - a.X;
double ABy = b.Y - a.Y;
//Находим перпендикуляр:
double Px = -ABy;
double Py = ABx;
//Длина перпендикуляра:
double LenP = Math.Sqrt(Math.Pow(Px, 2.0) + Math.Pow(Py, 2.0));
//Нормализуем вектор P (приводим к единичной длине):
Px = Px / LenP;
Py = Py / LenP;
//Находим нужные координаты центра окружности:
double Hx = (a.X + b.X) / 2 + Px * h;
double Hy = (a.Y + b.Y) / 2 + Py * h; |
|
|