c # — Нахождение дуги / центра круга с учетом 2 точек и радиуса

Я пишу интерпретатор GCode и мне очень трудно определить центр круга, когда ему дается (X, Y) для 2 точек на круге и радиуса.

Я могу построить круг из 2 точек, если ему дана центральная точка, но если вместо этого указано значение радиуса, я не могу перевести его в центральную точку.

Я посмотрел несколько примеров, которые написаны в разных формах математики (исчисление, геометрия, триггеры и т. Д.), Но не могу перевести ни один из них в код.

Я нашел этот же вопрос здесь только с одним реальным ответом в Visual Basic, но похоже, что раздел вставленного кода опирается на дополнительный код, который не включен.

Насколько я понимаю, данные значения генерируют 2 разных центра / пересекающихся точек. Это то, что мне нужно выяснить.

Переводчик работает на Arduino и написан на C. Если бы кто-то мог просто провести меня через это в псевдокоде, я был бы очень благодарен.

Спасибо!

5

Решение

В c #:

 private double CenterX(double x1,double y1, double x2, double y2,double radius)
{
double radsq = radius * radius;
double q = Math.Sqrt(((x2 - x1) * (x2 - x1)) + ((y2 - y1) * (y2 - y1)));
double x3 = (x1 + x2) / 2;return x3 + Math.Sqrt(radsq - ((q / 2) * (q / 2))) * ((y1 - y2) / q);}

private double CenterY(double x1, double y1, double x2, double y2, double radius)
{
double radsq = radius * radius;
double q = Math.Sqrt(((x2 - x1) * (x2 - x1)) + ((y2 - y1) * (y2 - y1)));

double y3 = (y1 + y2) / 2;

return y3 + Math.Sqrt(radsq - ((q / 2) * (q / 2))) * ((x2-x1) / q);}
4

Другие решения

Дано уравнение окружности и уравнения средних точек:

q = sqrt((x2-x1)^2 + (y2-y1)^2)

y3 = (y1+y2)/2

x3 = (x1+x2)/2

Один ответ будет:

x = x3 + sqrt(r^2-(q/2)^2)*(y1-y2)/q

y = y3 + sqrt(r^2-(q/2)^2)*(x2-x1)/q

Другой будет:

x = x3 - sqrt(r^2-(q/2)^2)*(y1-y2)/q

y = y3 - sqrt(r^2-(q/2)^2)*(x2-x1)/q

Предполагая, что переменные для точек уже были объявлены, ваш код должен выглядеть следующим образом:

double q = Math.Sqrt(Math.Pow((x2-x1),2) + Math.Pow((y2-y1),2));

double y3 = (y1+y2)/2;

double x3 = (x1+x2)/2;

double basex = Math.Sqrt(Math.Pow(r,2)-Math.Pow((q/2),2))*(y1-y2)/q; //calculate once
double basey = Math.Sqrt(Math.Pow(r,2)-Math.Pow((q/2),2))*(x2-x1)/q; //calculate once

double centerx1 = x3 + basex; //center x of circle 1
double centery1 = y3 + basey; //center y of circle 1
double centerx2 = x3 - basex; //center x of circle 2
double centery2 = y3 - basey; //center y of circle 2

источник: http://mathforum.org/library/drmath/view/53027.html

5

Это ruby-версия того же кода, если она кому-то понадобится (благодаря C # -коду от rookie1024)

def chord
@chord ||= begin
a =  (point_1.x.to_f - point_2.x.to_f).abs ** 2
b =  (point_1.y.to_f - point_2.y.to_f).abs ** 2
Math.sqrt(a + b)
end
end

def radius
@radius ||= begin
s = (chord / 2) * bulge
((chord/2) ** 2 + (s ** 2))/(2*s)
end.to_f
end

def center
x1 = point_1.x
y1 = point_1.y

x2 = point_2.x
y2 = point_2.y

x3 = (x1+x2)/2
y3 = (y1+y2)/2

basex = Math.sqrt((radius ** 2) - ((chord/2) ** 2)) * (y1-y2)/chord

basey = Math.sqrt((radius ** 2) - ((chord/2) ** 2)) * (x2-x1)/chord

centerx1 = x3 + basex
centery1 = y3 + basey
centerx2 = x3 - basex
centery2 = y3 - basey

bulge > 0 ? [centerx1, centery1] : [centerx2, centery2]
end
0
По вопросам рекламы [email protected]