2016-03-24 3 views
3

Я пишу интерпретатор GCode, и мне очень сложно определить центр круга при задании (X, Y) для двух точек на круге и радиусе.Найти центр дуги/окружности, заданный 2 очка и радиус

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

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

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

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

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

Спасибо!

+4

Круг через две точки с радиусом имеет два решения. –

+0

Отметьте [this] (http://stackoverflow.com/a/4914148/1183079) ответ, но вместо просто sqrt используйте Math.Sqrt. – Kateract

ответ

3

В 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); 


    } 
+1

Коди, это выглядит замечательно. Я попробую, как только смогу, и отчитаюсь. Благодаря! –

+0

Меня интересует ваш проект. Вы пишете интерпретатор с ЧПУ, чтобы использовать его с ардуино? –

+0

Yessir. Все идет нормально. Я тестировал боевые действия против файлов G-Code, созданных из разных источников, поскольку G-Code не имеет реального стандарта.Дуги определенно были препятствием, но я могу обработать их при задании команд (I, J, K). Существует программа с открытым исходным кодом GRBL, которая работает на Arduino и отлично обрабатывает G-Code. Это, безусловно, программа выбора для людей, которые строят свои собственные станки с ЧПУ на Arduino. –

5

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

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

+0

Я придумаю версию C# через несколько часов. –

+0

welp ... cody уже сделано один. выглядит великолепно. –

+0

Спасибо за ответ Крис. Я должен быть очень ограничен линейным мышлением. У меня такое трудное решение для X3 и Y3, когда они находятся в правой части уравнения. –

0

Эта версия рубин и тот же код, если кто-то это нужно, (спасибо 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 
Смежные вопросы