Форум программистов, компьютерный форум, киберфорум
Delphi: Графика, звук, видео
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/25: Рейтинг темы: голосов - 25, средняя оценка - 4.88
2 / 2 / 2
Регистрация: 29.09.2012
Сообщений: 444
1

Как нарисовать линию из точек

10.03.2015, 21:36. Показов 4721. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте.

Подскажите пожалуйста, как нарисовать линию из точек, задав начальные и конечные координаты?
Надо нарисовать ровненькую аккуратную линию пиксель к пикселю, в независимости под каким углом она нарисуется.

Надо взять точку Form1.canvas.Pixels[x, y]:=clBlack; и из них нарисовать линию от начальной заданной координаты, до конечной заданной координаты.

Наверно надо ещё как-то высчитывать кол-во точек на отрезке, чтобы под углом например в 35 градусов рисовалась ровная линия пиксель к пикселю.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.03.2015, 21:36
Ответы с готовыми решениями:

Нарисовать линию из трех неизвестных точек на image
for I := 0 to Image1.Width - 1 do for J := 0 to Image1.Height - 1 do begin if...

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

Как нарисовать линию под углом?
Мне нужно нарисовать линию под углом, например, 37 градусов к оси Х. Есть ли такой компонент,...

Нарисовать линию из точек
Здравствуйте, помогите пожалуйста разобраться как в MainWindow нарисовать линию из точек...

18
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
10.03.2015, 21:42 2
Метод TCanvas.LineTo() - он придуман специально для тех, кто не склонен к мазохизму)
0
2 / 2 / 2
Регистрация: 29.09.2012
Сообщений: 444
10.03.2015, 21:47  [ТС] 3
Так и знал что такой ответ будет вначале.
Ну я же не просто так спросил и подробно расписал вопрос. Надо именно из точек, чтобы ровная линия была, а не ступеньками.
Я буду рисовать на графическом движке, по координатам x и y.
Если рисовать сразу линию, то она грубая получается, ступенчатая, если рисуется не под прямым или 45 градусов углом.
0
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
10.03.2015, 21:50 4
Ты вообще хоть чуточку представляешь как организовано растровое изображение ?)
0
northener
10.03.2015, 21:53
  #5

Не по теме:

mss, так у ТС в руках будет волшебная палочка "графический движок"

0
2 / 2 / 2
Регистрация: 29.09.2012
Сообщений: 444
10.03.2015, 21:59  [ТС] 6
Я что-то типа этого думал:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function DravLinePoint(P_x0, P_y0, P_x1, P_y1 : Extended; var ILine: Integer):TPoint; 
var
P_x, P_y :Extended;
LengthLine: Extended; // Длина отрезка
NumPixel: Integer; // Кол-во точек
begin
   LengthLine:= Sqrt((sqr(P_x1 - P_x0) + sqr(P_y1 - P_y0)));
   NumPixel:= Trunc(LengthLine / 0.5 );
 
   if NumPixel = 0 then Exit;
 
   iLine :=  iLine + 1;
   P_x := P_x0 + (P_x1 - P_x0) * iLine / NumPixel ;
   P_y := P_y0 + (P_y1 - P_y0) * iLine / NumPixel ;
  
   Result.X:= Trunc(P_x);
   Result.Y:= Trunc(P_y);
 
    if iLine >= NumPixel  then begin
      iLine :=  NumPixel;
       ///////-------------
      end;
 end;
В общем если кто сталкивался, напишите.
0
mss
10.03.2015, 22:01
  #7

Не по теме:

Цитата Сообщение от Cannon1 Посмотреть сообщение
Если рисовать сразу линию, то она грубая получается
Наверно потому что состоит она не из точек, а из палочек)
А Палочка она не из точек состоит, а из других более мелких палочек)
А те, в свою очередь, из других, еще более мелких ..
А самая маленькая из палочек - это не точка, а нанопалочка)

0
Модератор
3490 / 2613 / 741
Регистрация: 19.09.2012
Сообщений: 7,974
10.03.2015, 22:12 8
Цитата Сообщение от Cannon1 Посмотреть сообщение
Если рисовать сразу линию, то она грубая получается, ступенчатая
А ты не задумывался почему так происходит?
0
2 / 2 / 2
Регистрация: 29.09.2012
Сообщений: 444
10.03.2015, 22:13  [ТС] 9
Та понятно что пиксели квадратные, думал может из точек аккуратней будет, если их кол-во считать по диагонали, плюс прозрачность увеличить.
0
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
10.03.2015, 22:23 10
Цитата Сообщение от Cannon1 Посмотреть сообщение
Та понятно что пиксели квадратные
Ты их в мелкоскоп что ли разглядывал ?
Или они тебе сами сказали "мы квадратные" ?)

Цитата Сообщение от Cannon1 Посмотреть сообщение
если их кол-во считать по диагонали
Какая "диагональ" может быть у отрезка прямой ?)

Цитата Сообщение от Cannon1 Посмотреть сообщение
плюс прозрачность увеличить
Прозрачность пикселя ?!
Если ты умудришься это сделать, тебе сразу шнобелевскую премию врУчат).. А может быть вручАт)
0
northener
10.03.2015, 22:24
  #11

Не по теме:

Цитата Сообщение от Cannon1 Посмотреть сообщение
Та понятно что пиксели квадратные
Ага. А электроны круглые.

0
2 / 2 / 2
Регистрация: 29.09.2012
Сообщений: 444
10.03.2015, 22:29  [ТС] 12
Ну квадратные образно, понятно что если рисовать длинную линию под углом со смещением в один пиксель, то её физичекски плавной не сделать.
А прозрачность в движке есть, в методе рисования точки и линии, мне то интересен алгоритм был, как вывести точками как можно красивее.
Ладно, тему можно закрыть, или удалить, пользы от неё не будет наверно.
0
mss
10.03.2015, 22:29
  #13

Не по теме:

А электроны круглые
А площадь круга пи эр квадрат..
И когда они по проводам бегут, то задевают друг друга углами.
Оттого утюг и нагревается что задевают)

0
5786 / 4528 / 1431
Регистрация: 14.04.2014
Сообщений: 20,157
Записей в блоге: 20
10.03.2015, 22:30 14
тут - решение для одного цвета
https://ru.wikipedia.org/wiki/Алгоритм_Брезенхэма
тут - со сглаживанием
https://ru.wikipedia.org/wiki/Алгоритм_Ву
1
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
10.03.2015, 22:44 15

Не по теме:

Цитата Сообщение от Cannon1 Посмотреть сообщение
мне то интересен алгоритм был, как вывести точками
Так тебе, оказывается, не ехать, а шашечки ?
Ну так бы сразу и сказал)
А то "движок"))



Добавлено через 12 минут

Не по теме:

пиксели квадратные, думал может из точек аккуратней будет..тему можно закрыть
Видать не суждено нам приобщиться к великой тайне различия точки и пиксела

0
Модератор
3490 / 2613 / 741
Регистрация: 19.09.2012
Сообщений: 7,974
10.03.2015, 23:46 16
Цитата Сообщение от krapotkin Посмотреть сообщение
На Дельфи:
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
function draw_line(x1, y1, x2, y2: Real): Integer;
var
  dx, dy, gradient, tmp: Real;
  yend, xgap, intery: Real;
  x, xend, xpxl1, ypxl1, xpxl2, ypxl2: Integer;
  c: Byte;
begin
  if x2 < x1 then
  begin
    tmp := x1;
    x1 := x2;
    x2 := tmp;
    tmp := y1;
    y1 := y2;
    y2 := tmp;
  end;// if
 
  dx := x2 - x1;
  dy := y2 - y1;
  gradient := dy / dx;
 
  xend := Ceil(x1);
  if xend <> x1 then
    yend := y1 + gradient / (xend - x1)
  else
    yend := y1;
  xgap := 1 - Frac(x1 + 0.5);
  xpxl1 := xend;  
  ypxl1 := Trunc(yend);
 
  c := Round((Frac(yend) / xgap) * 255);
  Form1.Canvas.Pixels[xpxl1, ypxl1] := RGB(c, c, c);
  c := Round((1 - Frac(yend) / xgap) * 255);
  Form1.Canvas.Pixels[xpxl1, ypxl1 + 1] := RGB(c, c, c);
 
  intery := yend + gradient;
        
  xend := Ceil(x2);
  if xend <> x2 then
    yend := y2 + gradient / (xend - x2)
  else
    yend := y2;
  xgap := Frac(x2 + 0.5);
  xpxl2 := xend;
  ypxl2 := Trunc(yend);
 
  c := Round((Frac(yend) / xgap) * 255);
  Form1.Canvas.Pixels[xpxl2, ypxl2] := RGB(c, c, c);
  c := Round((1 - Frac(yend) / xgap) * 255);
  Form1.Canvas.Pixels[xpxl2, ypxl2 + 1] := RGB(c, c, c);
 
  for x := xpxl1 + 1 to xpxl2 - 1 do
  begin
    c := Round(Frac(intery) * 255);
    Form1.Canvas.Pixels[x, Trunc(intery)] := RGB(c, c, c);
    c := Round((1 - Frac(intery)) * 255);
    Form1.Canvas.Pixels[x, Trunc(intery) + 1] := RGB(c, c, c);
    intery := intery + gradient;
  end;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  draw_line(1200, 500, 100.3, 100.3);
end;
1
пофигист широкого профиля
4733 / 3167 / 859
Регистрация: 15.07.2013
Сообщений: 18,252
11.03.2015, 02:29 17
Цитата Сообщение от krapotkin Посмотреть сообщение
тут - решение для одного цвета
https://ru.wikipedia.org/wiki/Алгоритм_Брезенхэма
тут - со сглаживанием
https://ru.wikipedia.org/wiki/Алгоритм_Ву
А это точно что Дельфи не использует эти давно известные алгоритмы. Особенно первый.
0
5786 / 4528 / 1431
Регистрация: 14.04.2014
Сообщений: 20,157
Записей в блоге: 20
11.03.2015, 08:30 18
человеку движок надо, пусть знает, как там в делфи...
если точнее, то прямо в GDI
у брезенхема важен сам подход к работе с "полупикселями"
потом пригодится мильен раз
0
2 / 2 / 2
Регистрация: 29.09.2012
Сообщений: 444
11.03.2015, 10:26  [ТС] 19
Спасибо, интересно получилось, жаль что пока применить не смогу, тк сложновато для меня.

Движок то уже написан и автор его к сожалению забросил пару лет назад, вот там можно вывести точку, или линию к примеру, с указанным цветом $FF000000, где FF - альфа канал, дальше RGB.
А как прикрутить сюда Алгоритм_Ву - фиг знает.

К примеру вот так выводится точка:
Canvas.PutPixel (x, y: Single; Color: Cardinal); overload;
а так линия:
Canvas.Line (x1, y1, x2, y2: Single; Color: Cardinal); overload;

Ну да ладно, спасибо, много нового узнал.
0
11.03.2015, 10:26
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.03.2015, 10:26
Помогаю со студенческими работами здесь

Нарисовать ось координат без четвертей и место точек сделать линию
Нужно нарисовать вот такую ось координат только без четвертей и место точек сделать линию!!! Кол-во...

Как нарисовать линию?
Point P7(74,10); P7.Draw(dc); Point P8(300,300); P8.Draw(dc); dc.MoveTo(......); сюда...

Как нарисовать линию?
Подскажите, использую TurboC++, как нарисовать линию, любую! хочу начать практиковаться

Как нарисовать линию
Подскажите, пожалуйста, как нарисовать линию на экране монитора?


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru