С Новым годом! Форум программистов, компьютерный форум, киберфорум
Delphi: Графика, звук, видео
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
 Аватар для woojin
0 / 0 / 0
Регистрация: 19.10.2013
Сообщений: 3

как нарисовать стрелку в конце дуги?

19.10.2013, 15:51. Показов 2757. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
всем здравствуйте!

возникла у меня такая проблема:
есть дуга (может быть повёрнут относительно своего цента как угодно),
требуется нарисовать в конце дуги стрелку (наконечник, указатель), так чтобы стороны стрелки на касались дуги

1 изображение - как не надо
2 изображение - как надо

и по этому поводу вопрос, как правильно рассчитать такого рода художеста
для простоты пусть дуга будет горизонтальной, высота 100, ширина 200
Изображения
  
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.10.2013, 15:51
Ответы с готовыми решениями:

как нарисовать стрелку в GDI+?
Кто-нибудь подскажите как нарисовать стрелку.я нарисовал линию, теперь чтобы получилась стрелка мне надо построить треугольник на конце...

Как нарисовать стрелку с наконечником не на конце?
Здравствуйте! Рисую стрелку этим кодомprocedure arrow(nachalo,konec:tpoint); var B, deltaX, deltaY: Extended; begin ...

Как на конце линии нарисовать крупную стрелку
Здравствуйте) нашел как нарисовать обычную стрелку на конце линии, но она очень мелкая, пару миллиметров всего. Как сделать, чтобы она...

6
Заблокирован
20.10.2013, 13:28
Видите ли... без того метода, коим дуга рисовалась, трудно что-либо советовать.

Добавлено через 16 минут
Если вам известны координаты центра. тогда проще. От центра до того места где кончается дуга и должна быть стрелка проведите прямую, и постройте к ней перпендикуляр, то есть касательную к траектории дуги. И вычислите угол её наклона к горизонтали. Этот угол и будет углом поворота стрелки.

Добавлено через 10 минут
Если у вас элипс, то нужно найти центр его фокуса в том месте, где кончается дуга. И вот к радиусу этого фокуса строить касательную
0
 Аватар для woojin
0 / 0 / 0
Регистрация: 19.10.2013
Сообщений: 3
20.10.2013, 13:53  [ТС]
дуга должна быть эллипсной (полу-эллипс)
есть две формулы
L=2*3.14*R*(x/360), где x - угол дуги в градусах.
С=Alpha*R, где Alpha - радианная мера дуги.
какую использовать для построения дуги не знаю

надо наверное сформулировать подругому, как расчиать угол поворота стрелки (наконечника) относительно конца дуги!!!
0
Заблокирован
20.10.2013, 14:56
Если вы строите по формуле и можете получить координаты предыдущей точки на расстояние длины стрелки, то проблем никаких.
0
Заблокирован
22.10.2013, 11:59
Нашёл я решение вашей проблемы. Это кривая безе. Всё элементарно и просто. В проекте все навороты для задания параметров и координат, а по сути всё выполняет маленькая процедура и пара функций к ней.
Я воткнул процедуру рисования стрелок. Но... рисует не особо корректно на крутых перегибах. Поэтому лучше брать не предыдущую точку, а точку отстоящую на длину стрелки. Ну там поэкспериментировать нужно.
И ещё лучше бы перевести расчёт в мировые координаты, как полагается.
В общем пробуйте
Вложения
Тип файла: rar KB.rar (176.9 Кб, 56 просмотров)
0
Заблокирован
22.10.2013, 12:17
Да, самые лучшие результаты при итерации в 50 - 3 итерации на расчёт
И ещё. Я там не заметил что функция рисования стрелки рисует ещё и отрезок. Надо лишь убрать две строчки в этой процедуре.
0
 Аватар для woojin
0 / 0 / 0
Регистрация: 19.10.2013
Сообщений: 3
31.10.2013, 23:06  [ТС]
Lirrk, спасибо!!!
вот что получилось:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
var
  bm: TBitmap;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
   bm := TBitmap.Create;
   bm.Width := PaintBox1.Width;
   bm.Height := PaintBox1.height;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
  Count: integer;
 
begin
    Count: = 50; //количество точек
    bm.Canvas.FillRect(Bounds(0, 0, PaintBox1.Width, PaintBox1.Height));
    DrawBezier(bm.Canvas, Count, PenW, Color)
    PaintBox1.Canvas.Draw(0, 0, bm);
end;
 
procedure DrawEdje(P1, P2: TPoint; Arrow: boolean; Canvas: TCanvas; Color: TColor);
var
  Angle: real;
  p3, p4: TPoint;
  size, angle_shift: Integer;
 
begin
   size := 20;
   angle_shift := 160; // на сколько острой стрелка
   Canvas.Color := Color;
  if Arrow = true then
     begin
        Angle := 180 * ArcTan2(P2.y - P1.y, P2.x - P1.x) / pi;
        p3 := Point(P2.x + Round(size * cos(pi * (Angle + angle_shift) / 180)), P2.y + Round(size * sin(pi * (Angle + angle_shift) / 180)));
        p4 := Point(P2.x + Round(size * cos(pi * (Angle - angle_shift) / 180)), P2.y + Round(size * sin(pi * (Angle - angle_shift) / 180)));
        Canvas.MoveTo(p2.X,p2.Y);
        Canvas.LineTo(p3.X,p3.y);
        Canvas.MoveTo(p2.X,p2.Y);
        Canvas.LineTo(p4.X,p4.y);
 
        Canvas.MoveTo(p1.X,p1.Y);
        Canvas.LineTo(p3.X,p3.y);
        Canvas.MoveTo(p1.X,p1.Y);
        Canvas.LineTo(p4.X,p4.y);
  end;
end;
 
function GetBinomialCoefficient(m, i: Integer): single;
  function Factorial(x: Integer): double;
  var
    i: Integer;
  begin
     result := 1;
     for i := 2 to x do
       result := result * i;
  end;
 
begin
   result := Factorial(m) / (Factorial(i) * Factorial(m - i));
end;
 
procedure DrawBezier(Canvas: TCanvas; Count: Integer; PenW: Integer = 2; Color: TColor = clRed);
type
  TPointFArray = array [word] of TPoint;
  PPointFArray = ^TPointFArray;
 
var
  p: PPointFArray;
  Step, qx, qy, t, q: single;
  i, j, n: Integer;
  BezierPoints: array of TPoint;
  PointShift: single;
  C: array of single;
 
begin
   n := 3;
   SetLength(BezierPoints, n);
   SetLength(C, n);
 
//координаты трапеции для полуэллипса
   PointShift := Canvas.Width / 3;
   BezierPoints[0] := TPoint.Create(Canvas.Width, Canvas.Height);
   BezierPoints[1] := TPoint.Create(Canvas.Width - PointShift, 0);
   BezierPoints[2] := TPoint.Create(Canvas.Width - PointShift * 2, 0);
   BezierPoints[3] := TPoint.Create(0, Canvas.Height);
 
   for i := 0 to n do
     C[i] := GetBinomialCoefficient(n, i);
 
   GetMem(p, sizeof(TPoint) * (Count + 1));
   Step := 1.0 / Count;
   for i := 0 to Count do
     begin
        t := i * Step;
        qx := 0;
        qy := 0;
        for j := 0 to n do
          begin
             q := C[j] * IntPower(1 - t, j) * IntPower(t, n - j);
             qx := qx + q * BezierPoints[j].x;
             qy := qy + q * BezierPoints[j].y;
          end;
        p[i] := PointF(qx, qy);
     end;
 
   Canvas.Pen.Color := Color;
   Canvas.pen.Width := PenW;
   i := 0;
   while (i <= Count - 1) do
      begin
         Canvas.MoveTo(p[i], p[i + 1], 100);
         Canvas.LineTo(p[i+1].x, p[i+1].y);
         inc(i, 2);
      end;
 
   DrawEdje(p[Count - 1], p[Count], true, Canvas, Color);
 
   FreeMem(p);
end;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
31.10.2013, 23:06
Помогаю со студенческими работами здесь

Как нарисовать стрелку
Здравствуйте. У меня имеются две точки с координатами, заранее они неизвестны, т.к. координаты вносятся по нажатию мыши. Задача состоит в...

Как нарисовать стрелку ?
Что надо добавить в этот код чтобы вместо линии рисовалась стрелка? var line = new Line { Stroke = Brushes.Black, X1 =...

Как нарисовать стрелку на Image
Подскажите как нарисовать стрелку на Image?

Как в WPF нарисовать круг и стрелку ?
По заданию мне нужно нарисовать граф, который будет находить кратчайшие пути...кругом я хочу отметить города ( внутри круга будет цифра), а...

Нарисовать стрелку как у аналоговых приборов
Доброго времени суток. Подскажите, как можно нарисовать стрелку как у аналоговых приборов ? Например:


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru