Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Рисование стрелки, как и где отобразить ёе указатель 
:(
    Опции темы
patison
Дата 9.3.2007, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Есть два эллипса с координатами центра (x1, y1) и (x2, y2) (для простоты эллипсы можно рассматривать как обычные точки). Они соединяются прямой при помощи функции LineTo. 
Помимо прямой необходимо указать из какого эллипса в какой "движется" эта прямая (пытаюсь рализовать граф. представление графа). Проблема заключается вот в чем - необходимо каким-то образом показать откуда куда движется прямая ("кого" с "кем" она соединяет). 

Буду очень благодарен за вашу помощь!
PM MAIL   Вверх
Earnest
Дата 9.3.2007, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



Ну так и рисуй стрелку: хочешь - как треугольник, хочешь - как 2 отрезка по сторонам линии. Неужели так боишься элементарной геометрии и не можешь рассичитать концы отрезков, изображающих стрелку?


--------------------
...
PM   Вверх
patison
Дата 9.3.2007, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Видишь-ли в чём проблема. Я хотел сделать след. образом - провести эту прямую, потом в нескольких пикселях от эллипса куда "пришла" прямая нарисовать маленький кружочег. Заюзал я уравенение прямой проходящей через две точки. Но чё-т при перемещении одного из моих эллипсов этот маленький кружочек движется по длинне прямой. 
Код

if(Y2-Y1)
{
  if(Y2>Y1)Ellipse(hdc, ((Y2-10-Y1)*(X2-X1)/(Y2-Y1))+X1-3, Y2-10-3, ((Y2-10-Y1)*(X2-X1)/(Y2-Y1))+X1+3, Y2-10+3);
  else     Ellipse(hdc, (Y2+10-Y1)*(X2-X1)/(Y2-Y1)+X1-3, Y2+10-3, ((Y2+10-Y1)*(X2-X1)/(Y2-Y1))+X1+3, Y2+10+3);    
}

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


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 7
Всего: 118



хотя я дааавно делал так : рисовал сначала  само окончания стрелки (кружками с увеличивающимися радиусами, отступая от края стрелки), потом делал ей "обрезание" хвоста (где более широкая часть) тоже кружком, но фонового цвета, потом рисовал линию поверх (ну или линию "до" - не важно)... получалось очень симпатичная стрелка.... тока реализация хз где.

сори за делфи) но идею стрелки никто не изменял)
Код

procedure TForm1.DrawArrow(Cv : TCanvas; x1, y1, x2, y2 : Integer);
var
  k1, a, b, c, D : Real;
  xp, yp, x3, y3, x4, y4 : Integer;
  lgth, wd2: Integer;
begin
  lgth := 25;
  wd2 := 4;
  Cv.PenPos := Point(x1, y1);
//  Cv.LineTo(x2, y2);
  if abs(x2-x1) > 8 then
  begin
    k1 := (y2-y1)/(x2-x1);
    a := sqr(k1)+1;
    b := 2*k1*(x2*y1-x1*y2)/(x2-x1)-2*y2*k1-2*x2;
    c := sqr(x2)+sqr(y2)-sqr(lgth)+sqr((x2*y1-x1*y2)/(x2-x1))-2*y2*(x2*y1-x1*y2)/(x2-x1);
    D := sqr(b)-4*a*c;
    xp := round((-b+sqrt(D))/(2*a));
    if (xp > x1) and (xp > x2) or (xp < x1) and (xp < x2) then xp := round((-b-sqrt(D))/(2*a));
    yp := round(xp*k1+(x2*y1-x1*y2)/(x2-x1));
    if y2 <> y1 then
    begin
      x3 := round(xp+wd2*sin(ArcTan(k1)));
      y3 := round(yp-wd2*cos(ArcTan(k1)));
      x4 := round(xp-wd2*sin(ArcTan(k1)));
      y4 := round(yp+wd2*cos(ArcTan(k1)));
    end
    else
    begin
      x3 := xp;
      y3 := yp-wd2;
      x4 := xp;
      y4 := yp+wd2;
    end;
  end
  else
  begin
    xp := x2;
    yp := y2-lgth;
    if (yp > y1) and (yp > y2) or (yp < y1) and (yp < y2) then yp := y2+lgth;
    x3 := xp-wd2;
    y3 := yp;
    x4 := xp+wd2;
    y4 := yp;
  end;
  Cv.Polygon([Point(x2, y2), Point(x3, y3), Point(x4, y4), Point(x2, y2)]);
end;



--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
patison
Дата 10.3.2007, 00:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



хм.. это решает мою проблему, но только частично.. предположим что указатель стрелочки я заменю просто одним кружочком. для этого мне необходимо его нарисовать НА моей прямой и в Х пекселях от точки куда указывает данная стрелка.
Всё сводится к поиску координат центра этого самого кружочка. Именно с этим я и мучаюсь уже несколько дней

зы надеюсь ясно выразил суть проблемы
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




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


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

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