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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Нарисовать стрелочку, геометрическая головоломка 
:(
    Опции темы
Snowy
Дата 31.1.2007, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 18
Всего: 484



Вот такая головоломочка мне попалась.
Сам я её решил. Но и предлагаю Вам поломать голову.
Дано:
Холст. На нём случайным образом выбраны 2 точки.
Задача:
Нарисовать стрелочку из точки A в точку B.
Стрелочка должна быть прямой, ширина линии 8 пикселей.
Приблизительно такого вида:
______|\
|XXXXXXX}
""""""""|/
Дополнительно: важна скорость, поэтому вычислений должно быть минимум.
PM MAIL   Вверх
Sartorius
Дата 31.1.2007, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1568
Регистрация: 18.7.2006
Где: Ivory tower

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



 А чем пользоваться-то можно? Вроде в GDI+ это и так есть, а в DirectX тоже несложно сделать...
PM MAIL ICQ   Вверх
Snowy
Дата 31.1.2007, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 18
Всего: 484



Я понимаю, что есть разные библиотеки и разные примитивы.
Задачка в том, чтобы самому расчитать все точки и построить по ним фигуру.
В данном случае это стрелочка.
А может быть и не стрелочка, а звёздочка например... Еврейская smile

Вот пример на Delphi7

Присоединённый файл ( Кол-во скачиваний: 13 )
Присоединённый файл  Project1.zip 5,68 Kb
PM MAIL   Вверх
MBo
Дата 31.1.2007, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Код

procedure DrawArrow(Canvas: TCanvas; X0, Y0, X1, Y1, Wdt: Integer);
var
  DX, DY, WX, WY, AX, AY: Integer;
  Len, Mult: Double;
  Pts: array[0..6] of TPoint;
begin
  DX := X1 - X0;
  DY := Y1 - Y0;
  Len := Hypot(DX, DY);
  if Len < Wdt then
    Exit;
  Mult := Wdt / (2 * Len);
  WX := Round(DY * Mult);
  WY := Round(DX * Mult);
  AX := X1 - 2 * WY;
  AY := Y1 - 2 * WX;
  Pts[0] := Point(X0 - WX, Y0 + WY);
  Pts[1] := Point(AX - WX, AY + WY);
  Pts[2] := Point(AX - 2 * WX, AY + 2 * WY);
  Pts[3] := Point(X1, Y1);
  Pts[4] := Point(AX + 2 * WX, AY - 2 * WY);
  Pts[5] := Point(AX + WX, AY - WY);
  Pts[6] := Point(X0 + WX, Y0 - WY);
  Canvas.Polygon(Pts);
end;

PM MAIL   Вверх
Snowy
Дата 31.1.2007, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 18
Всего: 484



Что, больше нет желающих головой подумать? smile 
PM MAIL   Вверх
Snowy
Дата 31.1.2007, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 18
Всего: 484



Ну ладно.
Раз желающих больше нет, выкладываю свой вариант:
Код
  procedure DrawArrow(Canvas: TCanvas; p1, p2: TPoint);
  const w = 8;
  var
    dx, dy, len: integer;
    p3:     TPoint;
    c, s:   double;
  begin
    dx := p2.X-p1.x; dy := p2.y-p1.y;
    len := Round(Sqrt(dx*dx + dy*dy));
    c := dx / len; s := dy / len;
    dx := Round(w / 2 * s); dy := Round(w / 2 * c);
    p3.X := Round(p2.X - w*4*c);
    p3.Y := Round(p2.Y - w*4*s);
    Canvas.Brush.Color := $CC6600;
    Canvas.Polygon([Point(p1.X-dx, p1.Y+dy), Point(p1.X+dx, p1.Y-dy),
                    Point(p3.X+dx, p3.Y-dy), Point(p3.X+dx*3, p3.Y-dy*3),
                    Point(p2.X, p2.Y),
                    Point(p3.X-dx*3, p3.Y+dy*3), Point(p3.X-dx, p3.Y+dy)]);
  end;

PM MAIL   Вверх
IvanoffAndrey
Дата 6.7.2009, 23:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Snowy - спасибо за стрелочку - помог сильно!
--------------------
Размерность пространства есть число Pi и в каждой точке вселенной оно стремиться к этому числу.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

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

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

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

FAQ раздела лежит здесь!


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

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


 




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


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

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