Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
AzgardC
7 / 7 / 1
Регистрация: 18.10.2012
Сообщений: 85
#1

Графические примитивы

15.02.2013, 08:24. Просмотров 831. Ответов 7
Метки нет (Все метки)

Всем привет!
Начал изучать графику. У меня тут следующее задание. Не пойму как нарисовать эти наросты))) С помощью дуг, эллипсов не получается, т.к. не могу определить для них квадраты в которые они вписываются. Есть ли еще какие-то способы в делфи нарисовать это?

Количество сторон можно менять.
Буду очень благодарен за помощь)

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

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.02.2013, 08:24
Ответы с готовыми решениями:

Графические примитивы
Люди, помогите пожалуйса сделать работу, уже убиваюсь с ней 7 й час. Сделал...

Графические примитивы
как нарисовать с помощью граф приметивов зонтик и чтобы он двигался в низ!?

Создать графические примитивы
1.Создать графические примитивы в Delphi (в обработке события OnPaint): ...

Построить графические примитивы
Друзья! прошу помогите пожалуйста построить на Delphi используя графические...

Тема Записи. делфи 7 (Графические примитивы)
Графические примитивы type TShapeList = (Rectangle, Triangle, Circle,...

7
angstrom
2470 / 1846 / 242
Регистрация: 14.09.2012
Сообщений: 5,981
Записей в блоге: 2
15.02.2013, 10:59 #2
Точки 6-угольника известны, от них и отталкивайся.

Не по теме:


тот кто это рисовал не очень то и старался "попасть".

1
AzgardC
7 / 7 / 1
Регистрация: 18.10.2012
Сообщений: 85
15.02.2013, 11:20  [ТС] #3
Известны то известны, но к примеру для дуги нужно сообразить квадрат куда вписана окружность который всегда рисуется в одном и том же положении. Т.е. пришлось бы постоянно искать новые координаты для левого верхнего и правого нижнего угла это квадрата или прямоугольника. Если попытаться рисовать точки полукругом от одного угла многоугольника до следующего, используя центром полукруга середину стороны многоугольника, то там начальный угол тоже постоянно разный. Не знаешь еще какие-нибудь методы?
0
Puporev
Модератор
54217 / 41850 / 28922
Регистрация: 18.05.2008
Сообщений: 98,518
15.02.2013, 12:20 #4
Для n>3 рисуется просто, сначала окружности, потом многоугольник,который перекрывает лишнее, а вот для треугольника не проходит, часть лишнего торчит...

Добавлено через 7 минут
Pascal
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
procedure TForm1.Button1Click(Sender: TObject);
var n,r,r1,x0,y0,x,y,i,j:integer;
    p:array of Tpoint;  //динамический массив точек
    a,da:real;
begin
n:=StrToInt(Edit1.Text); //количество вершин
r:=StrToInt(Edit2.Text); //радиус описанной окружности
da:=2*pi/n; //величина центрального угла = шаг поворота
//рисуем на Canvas Image1
with Image1 do
 begin
  x0:=Width div 2; //середина формы
  y0:=Height div 2;
  Setlength(p,n+1); //создаем массив - выделяем под него память(1-я точка 2 раза)
  if n mod 4=0 then a:=-da/2
  else a:=pi/2; //начальный угол от горизонтальной оси против часовой стрелки
  for i:=0 to n-1 do //создаем массив координат вершин
    begin
     p[i].x:=x0+round(r*cos(a));
     p[i].y:=y0-round(r*sin(a));
     a:=a+da;
    end;
  p[n]:=p[0]; //дублируем первую точку для замыкания полигона
 //рисуем окружности
 r1:=round(r*sin(da/2));
 with Canvas do
  begin
   for i:=1 to n do
    begin
     x:=(p[i-1].x+p[i].x) div 2;
     y:=(p[i-1].y+p[i].y) div 2;
     Ellipse(x-r1,y-r1,x+r1,y+r1);
    end;
 //рисуем многоугольник
   Pen.Color:=clRed; //красный цвет пера
   Pen.Width:=2; //линия потолще
   Polygon(p);
  end;
 end;
end;
1
AzgardC
7 / 7 / 1
Регистрация: 18.10.2012
Сообщений: 85
15.02.2013, 12:40  [ТС] #5
Puporev, Спасибо огромное! Все работает!
Мне кстати интересно. А с помощью алгоритма Брезенхема можно реализовать все это? Он ведь тоже рисует окружность, может и дугу можно?
0
FIL
Модератор
3412 / 2550 / 725
Регистрация: 19.09.2012
Сообщений: 7,920
15.02.2013, 12:45 #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
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
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Math;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
const
  r = 150;
  x0 = 300;
  y0 = 250;
 
var
  i, n: integer;
  p: array of TPoint;
 
procedure ArcRect(p1, p2: TPoint);
var
  pp, pp1, pp2: TPoint;
  rr: real;
 
begin
  rr := Sqrt(Sqr(p2.x - p1.x) + Sqr(p2.y - p1.y)) / 2;
  if p2.x > p1.x then
    pp.x := p1.x + (p2.x - p1.x) div 2
  else
    pp.x := p2.x + (p1.x - p2.x) div 2;
 
  if p2.y > p1.y then
    pp.y := p1.y + (p2.y - p1.y) div 2
  else
    pp.y := p2.y + (p1.y - p2.y) div 2;
 
  pp1.x := Round(pp.x - rr);
  pp1.y := Round(pp.y - rr);
  pp2.x := Round(pp.x + rr);
  pp2.y := Round(pp.y + rr);
 
  Canvas.Arc(pp1.x, pp1.y, pp2.x, pp2.y, p2.x, p2.y, p1.x, p1.y);
end;
 
begin
  n := StrToIntDef(Edit1.Text, 6);
 
  if (n < 3) or (n > 50) then Exit;
 
  SetLength(p, n);
 
  for i:=0 to n - 1 do
  begin
    p[i].x := Round(r * cos(i * 2 * pi / n) + x0);
    p[i].y := Round(r * sin(i * 2 * pi / n) + y0);
    if i > 0 then
      ArcRect(p[i-1], p[i]);
  end;
  ArcRect(p[n-1], p[0]);
  Canvas.Polygon(p);
end;
 
end.
1
Puporev
Модератор
54217 / 41850 / 28922
Регистрация: 18.05.2008
Сообщений: 98,518
15.02.2013, 12:51 #7
То же с дугами.
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
procedure TForm1.Button1Click(Sender: TObject);
var n,r,r1,x0,y0,x1,y1,x2,y2,x3,y3,x4,y4,i,j:integer;
    p:array of Tpoint;  //динамический массив точек
    a,da:real;
begin
n:=StrToInt(Edit1.Text); //количество вершин
r:=StrToInt(Edit2.Text); //радиус описанной окружности
da:=2*pi/n; //величина центрального угла = шаг поворота
//рисуем на Canvas Image1
with Image1 do
 begin
  x0:=Width div 2; //середина формы
  y0:=Height div 2;
  Setlength(p,n+1); //создаем массив - выделяем под него память(1-я точка 2 раза)
  if n mod 4=0 then a:=-da/2
  else a:=pi/2; //начальный угол от горизонтальной оси против часовой стрелки
  for i:=0 to n-1 do //создаем массив координат вершин
    begin
     p[i].x:=x0+round(r*cos(a));
     p[i].y:=y0-round(r*sin(a));
     a:=a+da;
    end;
  p[n]:=p[0]; //дублируем первую точку для замыкания полигона
 //рисуем дуги
 r1:=round(r*sin(da/2));//радиус дуг
 with Canvas do
  begin
   for i:=1 to n do
    begin
     x1:=(p[i-1].x+p[i].x) div 2-r1;
     y1:=(p[i-1].y+p[i].y) div 2-r1;
     x2:=(p[i-1].x+p[i].x) div 2+r1;
     y2:=(p[i-1].y+p[i].y) div 2+r1;
     x3:=p[i-1].x;y3:=p[i-1].y;
     x4:=p[i].x;y4:=p[i].y;
     Arc(x1,y1,x2,y2,x3,y3,x4,y4);
    end;
 //рисуем многоугольник
   Pen.Color:=clRed; //красный цвет пера
   Pen.Width:=2; //линия потолще
   Polygon(p);
  end;
 end;
end;
Добавлено через 54 секунды
Цитата Сообщение от AzgardC Посмотреть сообщение
А с помощью алгоритма Брезенхема можно реализовать все это?
Наверное можно, а зачем?
1
angstrom
2470 / 1846 / 242
Регистрация: 14.09.2012
Сообщений: 5,981
Записей в блоге: 2
15.02.2013, 13:05 #8
У меня примерно тоже самое. В принципе все варианты похожи
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
var
  buf   : array of TPoint;
  Point : Integer;
 
procedure TForm1.PaintBox1Paint(Sender: TObject);
var
  I, J  : Integer;
  X, Y  : Integer;
  Angle : Single;
begin
  if Length(buf) = 0 then
    Exit;
 
  Angle := 2 * pi / Point;
  with PaintBox1.Canvas do
  begin
    Pen.Color := clGreen;
    J := Round(100 * sin(Angle / 2));
    for I := 1 to Point do
    begin
      X := Round((buf[I - 1].X + buf[I].X) / 2);
      Y := Round((buf[I - 1].Y + buf[I].Y) / 2);
      Ellipse(X - J, Y - J, X + J, Y + J);
    end;
 
    Pen.Color := clRed;
    Polygon(buf);
  end;
end;
 
procedure TForm1.Edit1Change(Sender: TObject);
var
  I, x0, y0 : Integer;
  Angle     : Single;
begin
  Point := StrToIntDef(Edit1.Text, 3);
  if Point < 3 then
    Point := 3;
  SetLength(buf, Point + 1);
  Angle := 2 * pi / Point;
  x0 := PaintBox1.Width div 2;
  y0 := PaintBox1.Height div 2;
  for I := 0 to Point - 1 do
  begin
    buf[I].X := Round(100 * cos(Angle * I) + x0);
    buf[I].Y := Round(100 * sin(Angle * I) + y0);
  end;
  buf[Length(buf) - 1] := buf[0];
  PaintBox1.Refresh;
end;
Радиус задан жёстко - 100 пиксел.
1
15.02.2013, 13:05
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.02.2013, 13:05

Нарисовать рисунок, используя графические примитивы
Привет всем! Прошу помогите с графическими примитивами на Delphi. Необходимо...

Нарисовать приведенный рисунок, используя графические примитивы Delphi
используя графические примитивы Delphi изобразить рисунок и подписать по...

Графические возможности
ПРИВЕТ!!! :) Люди добрые, помогите пожалуйста нарисовать горный пейзаж...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru