Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Рисование стрелки


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

Буду очень благодарен за вашу помощь!

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

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

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);    
}

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

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

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;

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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)