реклама на сайте
подробности

 
 
> Как нарисовать стрелку в С++?, Рисование в Image
skyfoxx
сообщение May 12 2009, 11:02
Сообщение #1





Группа: Новичок
Сообщений: 6
Регистрация: 12-05-09
Пользователь №: 48 956



Есть x1,y1 начало линии и x2,y2 конец линии. Нарисовать в конце линии две линии образующие крылья стрелки. Координаты x1,y1,x2,y2 будут задаваться произвольно, направление крыльев стрелки должно меняться автоматически.

Стрелка должна отображатся в Image smile3046.gif
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Methane
сообщение May 12 2009, 11:14
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 615
Регистрация: 12-01-09
Из: США, Главное разведовательное управление
Пользователь №: 43 230



Цитата(skyfoxx @ May 12 2009, 14:02) *
Есть x1,y1 начало линии и x2,y2 конец линии. Нарисовать в конце линии две линии образующие крылья стрелки. Координаты x1,y1,x2,y2 будут задаваться произвольно, направление крыльев стрелки должно меняться автоматически.

что такое sin и cos знаем?
Go to the top of the page
 
+Quote Post
skyfoxx
сообщение May 12 2009, 11:23
Сообщение #3





Группа: Новичок
Сообщений: 6
Регистрация: 12-05-09
Пользователь №: 48 956



Цитата(Methane @ May 12 2009, 15:14) *
что такое sin и cos знаем?


Знаю но как их применить?
Go to the top of the page
 
+Quote Post
Methane
сообщение May 12 2009, 11:26
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 3 615
Регистрация: 12-01-09
Из: США, Главное разведовательное управление
Пользователь №: 43 230



Цитата(skyfoxx @ May 12 2009, 14:23) *
Знаю но как их применить?

Вы знаете координаты начала и конца.
Считаете угол наклона линии.
Потом прикидываете на какой угол у вас должны быть развернуты углы стрелки.
Потом находите точки, конца стрелки. Проводите линии. Нарисуйте на бумажке, и распишите углы. Сразу станет ясно.
Go to the top of the page
 
+Quote Post
Demeny
сообщение May 12 2009, 13:00
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 648
Регистрация: 11-02-06
Из: Санкт-Петербург
Пользователь №: 14 237



Цитата(Methane @ May 12 2009, 15:26) *
Вы знаете координаты начала и конца.
Считаете угол наклона линии.
Потом прикидываете на какой угол у вас должны быть развернуты углы стрелки.
Потом находите точки, конца стрелки. Проводите линии. Нарисуйте на бумажке, и распишите углы. Сразу станет ясно.

Прямой, но неэффективный и неинтересный подход, применимый только для примитивных стрелок. А как быть, если стрелку хочется с непрямыми усами, а хотя бы полукруглыми, наполовину закрашенными ?
Предлагаю другой путь. Как провести саму линию, надеюсь, понятно, а вот саму стрелку можно хранить в битмапе и выводить на экран поточечно, на ходу пересчитывая координаты точек с учетом поворота стрелки.
Для новичков - алгоритм следующий: 1) рисуем в любом графическом редакторе черно-белую стрелку, какую хочется, но направленную строго слева направо, в разрешении, например 8x8 пикселей; 2) затаскиваем массив отрисованных пикселей к себе в программу, причем удобно хранить массив в полярной системе координат с полюсом в точке, на которую указывает стрелка; каждая точка задается парой чисел (R, fi); 3) для того, чтобы вывести эту стрелку на экран достаточно посчитать угол наклона прямой, добавить этот угол ко всем полярным координатам точек и перевести новые полярные координаты в экранные по формулам x=x2+R*cos(fi); y=y2+R*sin(fi).


--------------------
Сделано в Китае. Упаковано в России.
Go to the top of the page
 
+Quote Post
Methane
сообщение May 12 2009, 13:04
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 3 615
Регистрация: 12-01-09
Из: США, Главное разведовательное управление
Пользователь №: 43 230



Цитата(Demeny @ May 12 2009, 16:00) *
удобно хранить массив в полярной системе координат с центром в точке, на которую указывает стрелка; каждая точка задается парой чисел (R, fi); 3) для того, чтобы вывести эту стрелку на экран достаточно посчитать угол наклона прямой, добавить этот угол ко всем полярным координатам точек и перевести новые полярные координаты в экранные по формулам x=x2+R*cos(fi); y=y2+R*sin(fi).

Уж если мой не удобный и не эффективный, то как назвать ваш метод я не знаю. К примеру размер стрелки в полярных координатах должен быть значительно больше реальной стрелки. Или вводить интерполяцию попикселям, что скажется на качестве.
Go to the top of the page
 
+Quote Post
Demeny
сообщение May 12 2009, 13:18
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 648
Регистрация: 11-02-06
Из: Санкт-Петербург
Пользователь №: 14 237



Цитата(Methane @ May 12 2009, 17:04) *
Уж если мой не удобный и не эффективный, то как назвать ваш метод я не знаю. К примеру размер стрелки в полярных координатах должен быть значительно больше реальной стрелки.

Не очень понял, почему должен быть больше ? Можно хранить 1:1, причём, учитывая всё же, что это стрелка, можно хранить полярные координаты только рисуемых точек, что сильно сократит объём массива.
Цитата(Methane @ May 12 2009, 17:04) *
Или вводить интерполяцию попикселям, что скажется на качестве.

Интерполяция тут не нужна, а для масштабирования стрелки достаточно умножить полярную координату R для каждой точки на нужный коэффициент.


--------------------
Сделано в Китае. Упаковано в России.
Go to the top of the page
 
+Quote Post
Methane
сообщение May 12 2009, 13:26
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 3 615
Регистрация: 12-01-09
Из: США, Главное разведовательное управление
Пользователь №: 43 230



Цитата(Demeny @ May 12 2009, 16:18) *
Не очень понял, почему должен быть больше ? Можно хранить 1:1, причём, учитывая всё же, что это стрелка, можно хранить полярные координаты только рисуемых точек, что сильно сократит объём массива.

Пропущенные пиксели будут.

Цитата
Интерполяция тут не нужна, а для масштабирования стрелки достаточно умножить полярную координату R для каждой точки на нужный коэффициент.

Аднозначно будут.
Тем более, я предлагал через тригонометрию посчитать две точки, вы предлагаете ВСЕ.
Go to the top of the page
 
+Quote Post
skyfoxx
сообщение May 12 2009, 13:56
Сообщение #9





Группа: Новичок
Сообщений: 6
Регистрация: 12-05-09
Пользователь №: 48 956



Цитата(Methane @ May 12 2009, 17:26) *
Пропущенные пиксели будут.


Аднозначно будут.
Тем более, я предлагал через тригонометрию посчитать две точки, вы предлагаете ВСЕ.

Думаю первый способ проще , ну плиииииииииззз киньте кость я в смысле по какой формуле можно енто дело расчетать?
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 25th July 2025 - 12:34
Рейтинг@Mail.ru


Страница сгенерированна за 0.01499 секунд с 7
ELECTRONIX ©2004-2016