На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! правила раздела Алгоритмы
1. Помните, что название темы должно хоть как-то отражать ее содержимое (не создавайте темы с заголовком ПОМОГИТЕ, HELP и т.д.). Злоупотребление заглавными буквами в заголовках тем ЗАПРЕЩЕНО.
2. При создании темы постарайтесь, как можно более точно описать проблему, а не ограничиваться общими понятиями и определениями.
3. Приводимые фрагменты исходного кода старайтесь выделять тегами code.../code
4. Помните, чем подробнее Вы опишете свою проблему, тем быстрее получите вразумительный совет
5. Запрещено поднимать неактуальные темы (ПРИМЕР: запрещено отвечать на вопрос из серии "срочно надо", заданный в 2003 году)
6. И не забывайте о кнопочках TRANSLIT и РУССКАЯ КЛАВИАТУРА, если не можете писать в русской раскладке :)
Модераторы: Akina, shadeofgray
  
> Нужен алгоритм рисования стрелки
    формат заголовка функции: Strelka(x1,y1, x2,y2)
      Цитата BiV, 17.04.03, 19:10:18
      формат заголовка функции: Strelka(x1,y1, x2,y2)


      да ну думать неохота
        Что то я не понимаю. Что такое x1,y1 x2,y2 и как понять алгоритм рисования стрелки???
          Может алгоритм вращения стрелки?
            Цитата GrAnd, 18.04.03, 08:31:24
            Что то я не понимаю. Что такое x1,y1 x2,y2 и как понять алгоритм рисования стрелки???


            Да ему нужно линию из x1,y1 в x2,y2, а на конце еще две коротенькие линии (или три). Вот он и хочет точки тех линий => углы cos/sin считать надо
              Тогда ему не алгоритм, а сорс нужен;)
                Сначала нужно найти пару ортогональных векторов (Vx, Vy) и (nx, ny). V - направлен из точки 1 в точку 2 (по направлению движения)
                ExpandedWrap disabled
                  <br>Vx := x2 - x1;<br>Vy := y2 - y1;<br>V  := sqrt(Vx*Vx + Vy*Vy);<br>Vx := Vx/V;<br>Vy := Vy/V;<br>

                Вектор n - перпендикулярен направлению движения
                ExpandedWrap disabled
                  <br>nx := Vy;<br>ny := -Vx;<br>

                Обозначим h и w - размеры рисуемой стрелки. Находим точку (x3,y3) лежащую на прямой проходящей из 1 в 2 и находящейся на расстоянии h от точки 2.
                ExpandedWrap disabled
                  <br>x3 := x2 - h*Vx;<br>y3 := y2 - h*Vy;<br>

                Теперь найдем точки (x4,y4) и (x5,y5) расположенные "по бокам" - зазубрины стрелки
                ExpandedWrap disabled
                  <br>x4 := x3 + w*nx;<br>y4 := y3 + w*ny;<br>x5 := x3 - w*nx;<br>y5 := y3 - w*ny;<br>

                Ну вот и все, осталось нарисовать
                ExpandedWrap disabled
                  <br>MoveTo(x1,y1);<br>LineTo(x2,y2);<br>LineTo(x4,y4);<br>LineTo(x5,y5);<br>LineTo(x2,y2);<br>


                ExpandedWrap disabled
                  <br>               (4)|\<br>                  | \<br>                  |  \<br>(1)------------(3)--(2)<br>                  |  /<br>                  | /<br>               (5)|/<br>

                Сообщение отредактировано: S.Yu.Gubanov -
                  По алгоритму S.Yu.Gubanov'а сурс (ТМТ Паскаль)
                  ExpandedWrap disabled
                    <br>Uses Graph,Crt,Strings;<br>var<br>  h,w,x3,y3,x1,y1,x2,y2,x4,y4,x5,y5,i,j       : LongInt;<br>  nx,ny,vx,vy,v:real;<br>begin<br>  { Set 256-colours graphics mode }<br>  SetSVGAMode(640,480,24,LfbOrBanked);<br>{ Сначала нужно найти пару ортогональных векторов (Vx, Vy) и (nx, ny). }<br>{ V - направлен из точки 1 в точку 2 (по направлению движения)         }<br>x1:=GetMaxX div 2;<br>y1:=GetMaxY div 2;<br>x2:=x1+20;<br>y2:=y2;<br>Vx := x2 - x1;<br>Vy := y2 - y1;<br>V  := sqrt(Vx*Vx + Vy*Vy);<br>Vx := Vx/V;<br>Vy := Vy/V;<br>{ Вектор n - перпендикулярен направлению движения }<br>nx := Vy;<br>ny := -Vx;<br>h:=15;<br>w:=10;<br>{ Обозначим h и w - размеры рисуемой стрелки. Находим точку (x3,y3) лежащую на }<br>{ прямой проходящей из 1 в 2 и находящейся на расстоянии h от точки 2.         }<br>x3 := x2 - Round(h*Vx);<br>y3 := y2 - Round(h*Vy);<br>{ Теперь найдем точки (x4,y4) и (x5,y5) расположенные "по бокам" - зазубрины }<br>{ стрелки }<br>x4 := x3 + Round(w*nx);<br>y4 := y3 + Round(w*ny);<br>x5 := x3 - Round(w*nx);<br>y5 := y3 - Round(w*ny);<br>{ Ну вот и все, осталось нарисовать }<br>  MoveTo(x1,y1);<br>  LineTo(x2,y2);<br>  LineTo(x4,y4);<br>  LineTo(x5,y5);<br>  LineTo(x2,y2);<br>  ReadKey;    { Get the key pressed     }<br>  CloseGraph; { Return to the text mode }<br>end.<br>
                    спасиб
                      Ааа... я как всегда опаздал :( но вдруг пригодится ;)
                      ExpandedWrap disabled
                        <br>Gug - острота угла стрелки в градусах<br>Lstr - длинна стрелки<br><br>void DrawVector(HDC hdc, int bx, int by, int ex, int ey)<br> {<br>  int ug;<br>  POINT poly[3];<br><br>  MoveToEx(hdc,bx,by,0);<br>  LineTo(hdc,ex,ey);<br>  ug=RetGrad(ex-bx,ey-by);<br>  ug=ug-Gug;<br>  poly[0].x=ex;<br>  poly[0].y=ey;<br>  poly[1].x=ex+Lstr*cos(ug*M_PI/180);<br>  poly[1].y=ey+Lstr*sin(ug*M_PI/180);<br>  ug=ug+2*Gug;<br>  poly[2].x=ex+Lstr*cos(ug*M_PI/180);<br>  poly[2].y=ey+Lstr*sin(ug*M_PI/180);<br>  SetPolyFillMode(hdc,WINDING);<br>  Polygon(hdc,poly,3);<br> }<br><br>int RetGrad(int w,int h)<br> {<br>  float fw=w,fh=h,fg=sqrt(fw*fw+fh*fh),fs,fc;<br>  if(fg==0) return 0;<br>  fs=fh/fg;fc=fw/fg;<br>  if(fs>=0) return 180.0*acos(fc)/M_PI;<br>   else return 360.0-180.0*acos(fc)/M_PI;<br> }<br>
                      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                      0 пользователей:


                      Рейтинг@Mail.ru
                      [ Script execution time: 0,0346 ]   [ 15 queries used ]   [ Generated: 21.05.24, 06:30 GMT ]