Страниц: [1] 2
  Печать  
Автор Тема: Алгоритм обработки G-code G02/G03 ( дуга по 2м точкам и радиусу)  (Прочитано 27755 раз)
Maed
Участник
*
Offline Offline

Сообщений: 35


Просмотр профиля
« : Августа 14, 2009, 05:13:37 pm »

Добрый день! Под QNX пишу интерпретатор G-Code для самодельного станка ЧПУ и не могу найти подходящий алгоритм для команд G02/G03 (Круговая интерполяция по/против часовой стрелки). Это команды построения дуги по 2м точкам и радиусу. Т.е есть следующий G-code (из википедии Smiley ):
Код:
G01 X0 Y0 F200
G02 X15 Y15 R5 F200
С G01 все понятно - "перейти к координатам х=0,у=0 (F200 нас не интересует)" - реализуется стандартным алгоритмом Брезенхема для линии. А вот для G02 (в приведенном мой примере G-code это что-то типа "построить дугу с начальной точкой в х=0; у=0, конечной точкой X1=15 Y1=15 и радиусом R=5") ника не могу найти подходящий алгоритм. Находил лишь упоминание алгоритма Брезенхема для дуги, но нигде нет его описания или примера реализации. Может кто знает как реализована обработка этой команды на промышленных ЧПУ??

UPD:Как мне кажется не совсем понятно, что именно мне нужно. Мне нужен интерпретатор, который на "входе" получает, допустим, приведенный выше пример G-code, а на "выходе" выдает координаты точек (Х;У), которые соответствуют этому  G-code.
« Последнее редактирование: Августа 14, 2009, 05:36:38 pm от Maed » Записан
mike
QOR.Moderator
*****
Offline Offline

Сообщений: 1186


Welcome to Lunatic Asylum.


Просмотр профиля WWW
« Ответ #1 : Августа 14, 2009, 06:05:29 pm »

не оно?
http://en.wikipedia.org/wiki/Midpoint_circle_algorithm
Записан
Maed
Участник
*
Offline Offline

Сообщений: 35


Просмотр профиля
« Ответ #2 : Августа 14, 2009, 06:14:41 pm »

На первый взгляд не совсем подходит, но все равно посмотрю. Возможно его можно адаптировать для дуги.
Записан
lestat
QOR.Moderator
*****
Offline Offline

Сообщений: 985


I don't trust anything


Просмотр профиля WWW
« Ответ #3 : Августа 14, 2009, 06:16:56 pm »

Вот брезенхем для дуг и окружностей:
http://www.codenet.ru/progr/video/alg/alg4.php
Записан

lestat
QOR.Moderator
*****
Offline Offline

Сообщений: 985


I don't trust anything


Просмотр профиля WWW
« Ответ #4 : Августа 14, 2009, 06:21:35 pm »

Вот ещё, только англоязычное, http://homepage.smc.edu/kennedy_john/belipse.pdf
Записан

Maed
Участник
*
Offline Offline

Сообщений: 35


Просмотр профиля
« Ответ #5 : Августа 14, 2009, 07:04:21 pm »

И где ж там дуги?? Честно говоря не сильно хочется просчитывать всю окружность ради дуги размером 1/16 этой окружности. За эллипс спасибо!
Записан
Maed
Участник
*
Offline Offline

Сообщений: 35


Просмотр профиля
« Ответ #6 : Августа 14, 2009, 07:24:36 pm »

нашел это: http://petrified.ucsd.edu/~ispg-adm/pubs/j_icga_89_1.pdf (англ). Но там дуга по трем точкам + что-то мне кажется что это просчет окружности по Брезенхему+отбрасывание ненужных точек.
Записан
lestat
QOR.Moderator
*****
Offline Offline

Сообщений: 985


I don't trust anything


Просмотр профиля WWW
« Ответ #7 : Августа 15, 2009, 12:04:24 am »

Если умножить одну из координат на константу, то вместо круга получится эллипс.
Записан

@gn
Jr. Member
**
Offline Offline

Сообщений: 97


Просмотр профиля
« Ответ #8 : Августа 15, 2009, 08:10:08 pm »

Микропроцессорные БИС и Микро-ЭВМ, построение и применение
под редакцией А.А.Васенкова
Москва "Советское радио" 1980

страница 254

Если в городской библиотеке гдето валяется такая книжка.
« Последнее редактирование: Августа 15, 2009, 09:50:34 pm от nOOb » Записан

пьяный за комп не садиться (себя памятка)
Maed
Участник
*
Offline Offline

Сообщений: 35


Просмотр профиля
« Ответ #9 : Августа 17, 2009, 04:44:29 pm »

В общем, подходящего алгоритма я не нашел. Теперь хочу использовать алгоритм Брезенхема для окружности. На http://en.wikipedia.org/wiki/Midpoint_circle_algorithm - есть общие заметки по его адаптации, но я не понимаю что значит "...where it is necessary to resort to trigonometric or square root computations.."  Кого сортировать? Как сортировать?? Объясните пожалуйста!
Записан
oder
Гость
« Ответ #10 : Августа 17, 2009, 06:05:36 pm »

http://lingvo.yandex.ru/en?text=resort&lang=en&search_type=lingvo&st_translate=on

2. гл.
(resort to)
1) прибегать к (чему-л.), обращаться к (чему-л.)
  to resort to threats — прибегать к угрозам
Записан
Maed
Участник
*
Offline Offline

Сообщений: 35


Просмотр профиля
« Ответ #11 : Августа 17, 2009, 06:57:50 pm »

Хм напоролся на "ложного друга" переводчика Smiley .Но все равно не понятно как адаптировать алгоритм Брезенхема для окружности для расчета дуги...
Записан
oder
Гость
« Ответ #12 : Августа 17, 2009, 07:55:27 pm »

Ну что не понятно? Считаешь координаты концов дуги. Исполняешь алгоритм для нужных квадрантов, но те точки, что до начала дуги (меньше/больше по координате X/Y, в зависимости от квадранта и направления), не рисуешь. А после конца дуги, вообще, можно из алгоритма сразу вываливаться.
« Последнее редактирование: Августа 17, 2009, 11:40:45 pm от oder » Записан
A_O
Full Member
***
Offline Offline

Сообщений: 212


Просмотр профиля
« Ответ #13 : Августа 17, 2009, 11:38:29 pm »

http://www.uni-protvino.ru/students/materials/up_materials/bin/292.doc
Записан
Maed
Участник
*
Offline Offline

Сообщений: 35


Просмотр профиля
« Ответ #14 : Августа 20, 2009, 02:14:27 pm »

Спасибо за инфу разбираюсь....
Небольшой офтопик (тему в "Программировании" открывать не хочется - проблема пустяковая ).  Есть код:

Код:
int main(int argc, char *argv[])
{
int i=0;
float Compensation[1]={0};
for (i=0;i<10;i++)
 {
 Compensation[i]=1;
 printf ("Compensation[%d]=%f\n",i, Compensation[i]);
 }
}
 
Компилирую, запускаю... На "выходе" получаю:
Цитировать
Compensation[0]=1.000000
Compensation[1]=1.000000
Compensation[2]=1.000000
Compensation[3]=1.000000
Compensation[4]=1.000000
Compensation[5]=1.000000
Compensation[6]=1.000000
Compensation[7]=1.000000
Compensation[8]=1.000000
Compensation[9]=1.000000
Почему не происходит ошибка "array out of bounds"??

Параметры системы:
Таргет - QNX 6.4.1 (на виртуалке)
ИДЕ  - Version: 4.5.0 Build id: I20081019 (WinXP)
Записан
Страниц: [1] 2
  Печать  
 
Перейти в: