Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с выводом дуги в Delphi 7 
:(
    Опции темы
S.A.G.
Дата 22.4.2007, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


не эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1339
Регистрация: 20.7.2006
Где: in ad equate

Репутация: нет
Всего: 19



Процедура Arc в качестве своих аргументов требует целые числа со знаком типа integer. Это значит что вершины квадрата описанного вокруг круга могут находиться за пределами области рисования. Но начиная с определенных больших значений она отказываеться рисовать дуги. Например такой вызов не рисует ничего (можете проверить сами):

Arc(-199, -175, 801, 825, 295, 94, 73, 285);

Почему? Первые два параметра точно описывают квадрат, вторые два впринципе не имеют значения т.к. точно отсекут дугу.

Это сообщение отредактировал(а) S.A.G. - 22.4.2007, 14:53


--------------------
Вот она задачка: спасти себя от себя самого © Cube
Sometimes good people do evil things © A Simple Plan
PM   Вверх
VladBD
Дата 22.4.2007, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 105
Регистрация: 19.11.2006

Репутация: 1
Всего: 5



Для больших значений там есть:
Цитата
Note:    On Windows 9x or Windows ME, the sums X1 + X2 and Y1 + Y2 cannot exceed 32768. Also, the sum X1 + X2 + Y1 + Y2 cannot exceed 32768.
On NT or Windows 2000, the drawing direction can be changed to clockwise using the Windows API call SetArcDirection.

Arc(-199, -50, 801, 825, 295, 94, 73, 285); - вот так в углу нарисовалась - проблема в координатах при которых на экране ничего не появиться...
PM MAIL   Вверх
S.A.G.
Дата 22.4.2007, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


не эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1339
Регистрация: 20.7.2006
Где: in ad equate

Репутация: нет
Всего: 19



Сумма не выходит за пределы, мало того она слишком мала по сравнению с пределом. С другой стороны я не пользователь ни Win98 ни WinMe.


--------------------
Вот она задачка: спасти себя от себя самого © Cube
Sometimes good people do evil things © A Simple Plan
PM   Вверх
Farmazon
Дата 22.4.2007, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Разработчик
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 7.7.2006

Репутация: нет
Всего: 5



Дуга не отсекается. 2-ая пара параметров имеет значение.

Посмотри результат выполнения 2 комманд в качестве доказательства:

Код

Ellipse(-199, -175, 801, 825);
Rectangle(295, 94, 73, 285);


Это сообщение отредактировал(а) Farmazon - 22.4.2007, 20:22


--------------------
Таково моё общее мнение.
PM MAIL WWW   Вверх
S.A.G.
Дата 22.4.2007, 20:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


не эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1339
Регистрация: 20.7.2006
Где: in ad equate

Репутация: нет
Всего: 19



Дуга в любом случае отсекаеться когда последняя пара суть разные точки.


--------------------
Вот она задачка: спасти себя от себя самого © Cube
Sometimes good people do evil things © A Simple Plan
PM   Вверх
Farmazon
Дата 22.4.2007, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Разработчик
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 7.7.2006

Репутация: нет
Всего: 5



Я просто не до конца разобрался с функцией... 


Разобрался вроде... Последняя пара не просто разные точки... В мануале написано что 3 пара - это начальные координаты, а 4 - это конечные координаты точек дуги. То есть если двигаться против часовой стрелки, дуга будет прорисовываться от 3 к 4 точке. Т.е. Координаты этих точек должны либо лежать на вписаном элипсе, либо быть рядом (хотя можно и не рядом.... 

Там работает, насколько я понял, так: берётся луч выходящий из центра элипса и проходящий через точку 3, находится персечение с элипсом (пусть точка _3), потом тоже самое вычисляется с 4 точкой (_4); потом рисуется элипс против часовой стрелки от _3 до _4 точки... Вот но если точки _3 и _4 совпадут? или мало будут различаться? Тогда либо дуга вообще не рисуется, либо рисуется вся...

Вот 1 случай твой... Возможно дуга и отсекается, но она мала и не влазиет в область для рисования... Я тут поэкспириментировал уменьшив масштаб в 10 раз...

...

Короче зря я развёль эту демагогию, отсечённая дуга и в правду просто не влазиет в область для рисования.

вот просто сместил на 40 пикселей - уже чо-то видать:

form1.Canvas.Arc(-199+40, -175+40, 801+40, 825+40, 295+40, 94+40, 73+40, 285+40);


--------------------
Таково моё общее мнение.
PM MAIL WWW   Вверх
S.A.G.
Дата 23.4.2007, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


не эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1339
Регистрация: 20.7.2006
Где: in ad equate

Репутация: нет
Всего: 19



Все влазит, все должно рисоваться но не рисуеться. У меня отрисовка идет в координатах PaintBox у которого свойство Align поставлено в alClient. Каждая проставленная точка отрисовываеться и видна, следовательно и дуга между ними тоже должна быть нарисована.


--------------------
Вот она задачка: спасти себя от себя самого © Cube
Sometimes good people do evil things © A Simple Plan
PM   Вверх
Farmazon
Дата 23.4.2007, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Разработчик
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 7.7.2006

Репутация: нет
Всего: 5



Балин! Координаты точек бывают и отрицательные (дуга проходит по отрицательным координатам, это всегда выше и левее левого верхнего угла - начала отсчёта)! Вот её и не видно, хоть ты там какой размер поставь.


--------------------
Таково моё общее мнение.
PM MAIL WWW   Вверх
S.A.G.
Дата 23.4.2007, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


не эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1339
Регистрация: 20.7.2006
Где: in ad equate

Репутация: нет
Всего: 19



Отрицательные координаты у ограничивающего квадрата. Посмотри на координаты отсекающих точек - где ты там минусы увидел?


--------------------
Вот она задачка: спасти себя от себя самого © Cube
Sometimes good people do evil things © A Simple Plan
PM   Вверх
Farmazon
Дата 23.4.2007, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Разработчик
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 7.7.2006

Репутация: нет
Всего: 5



Какой ОГРАНИЧИВАЮЩИЙ КВАДРАТ?! Я ж блин расписал для чего нужна 3 и 4 пары координат! А та отсеченная часть элипса вписанного в 1 и 2 пары координат как раз и лежит в отрицательных координатах.


--------------------
Таково моё общее мнение.
PM MAIL WWW   Вверх
S.A.G.
Дата 23.4.2007, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


не эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1339
Регистрация: 20.7.2006
Где: in ad equate

Репутация: нет
Всего: 19



3 и 4 точки лежат на дуге. Не может быть так чтобы дуга была не видна. Точки видны - дуги нет. По такому же самому алгоритму все работает только если радиус много меньше чем 500. например 250, 300 и меньше.


--------------------
Вот она задачка: спасти себя от себя самого © Cube
Sometimes good people do evil things © A Simple Plan
PM   Вверх
Farmazon
Дата 23.4.2007, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Разработчик
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 7.7.2006

Репутация: нет
Всего: 5



ой ... мама роди меня обратно....


ВОт это посмотри раз, не веришь что не помещается....
Код

form1.Canvas.Arc(-199+200, -175+200, 801+200, 825+200, 295+200, 94+200, 73+200, 285+200);
form1.Canvas.MoveTo(200, 0);
form1.Canvas.lineTo(200, 1000);
form1.Canvas.MoveTo(0, 200);
form1.Canvas.lineTo(1000, 200);


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

Добавлено через 1 минуту и 5 секунд
Вкурил?

Добавлено через 11 минут и 51 секунду
Если что, точки 3 и 4 не лежат на дуге....


--------------------
Таково моё общее мнение.
PM MAIL WWW   Вверх
Farmazon
Дата 23.4.2007, 19:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Разработчик
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 7.7.2006

Репутация: нет
Всего: 5



Как я понял, ты просто тоже недопонимаешь, как я сначала, как работает ф-я Arc:
Вот в паинте набросал рисунок... Жирная часть - рисуемая дуга, остальное дополнительные построения; 1, 2, 3, 4 - это точки с координатами передаваемыми в параметрах, О - центр эллипса...

Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  d.GIF 2,06 Kb


--------------------
Таково моё общее мнение.
PM MAIL WWW   Вверх
S.A.G.
Дата 23.4.2007, 19:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


не эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1339
Регистрация: 20.7.2006
Где: in ad equate

Репутация: нет
Всего: 19



Заставил себя запустить среду и проверить лично. Да, действительно, сверху но почему? Алгоритм прекрасно работает для меньших радиусов..

Добавлено через 2 минуты и 8 секунд
Неправильно определяються координаты ограничивающего квадрата.


--------------------
Вот она задачка: спасти себя от себя самого © Cube
Sometimes good people do evil things © A Simple Plan
PM   Вверх
Farmazon
Дата 23.4.2007, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Разработчик
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 7.7.2006

Репутация: нет
Всего: 5



Алгоритм правильно работает...

Я ж всё наглядно изобразил....
Почитай мануал, раз не веришь...

Это сообщение отредактировал(а) Farmazon - 23.4.2007, 20:02


--------------------
Таково моё общее мнение.
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0861 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.