Рисование)) никак не получаецо))

За вознаграждение или нахаляву (если повезёт)

Модераторы: Хыиуду, MOTOCoder, Medved, dr.Jekill

DOM
Сообщения: 35
Зарегистрирован: 18 апр 2008, 01:59

Задача следующая: нарисовать звезду и заполнить(залить ее) каким-либо цветом.Затем вокруг звезды описать квадрат.Звезду нарисовал, а вот ее окраска и рисование квадрата никак не выходит.
Конечно наверное это очень легко, но я эту тему не разбирал, а завтра показать задачку преподу надо полюбому))Помогите пожалуйста))

Код: Выделить всё

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  procedure StarLine(x0,y0,r:integer);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
var
x,y,r:integer;

procedure TForm1.StarLine(x0,y0,r:integer);
var
  p:array[1..11] of TPoint;
  a:integer;
  i:integer;
begin
  a:=18;
  for i:=1 to 10 do
    begin
      if (i mod 2=0) then
        begin
          p[i].x:=x0+Round(r/3*cos(a*2*pi/360));
          p[i].y:=y0-Round(r/3*sin(a*2*pi/360));
        end
      else
        begin
          p[i].x:=x0+Round(r*cos(a*2*pi/360));
          p[i].y:=y0-Round(r*sin(a*2*pi/360));
        end;
      a:=a+36;
  end;
  p[11].X:=p[1].X;
  p[11].Y:=p[1].Y;
  Canvas.Polyline(p);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Canvas.Pen.Color:=clRed;
  StarLine(200,250,100);
end;

end.
 
Собстенно вот код, который рисует звезду.Теперь надо ее окрасить и вписать ее в квадрат.
MOTOCoder
Сообщения: 548
Зарегистрирован: 14 янв 2008, 20:27
Откуда: Россия, Псков

Вместо Canvas.Polyline(p); используйте
[syntax='Delphi']
canvas.Brush.Color:=clred;
Canvas.Polygon(p);{заполненная звезда}
canvas.Brush.Style:=bsclear;
Canvas.Rectangle(p[5].X,p[9].y,p[11].x,p[3].y);{квадрат}
[/syntax]
Ни что так не ограничивает фантазию программиста, как компилятор...
DOM
Сообщения: 35
Зарегистрирован: 18 апр 2008, 01:59

Спосибище!!! Я так и думал, что так и надо делать))
Забыл блин Polyline удалить!
Еще раз СПС
DOM
Сообщения: 35
Зарегистрирован: 18 апр 2008, 01:59

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

Очень надо сделать, знаю что просто, но как всегда нету времени на изучение материала.Буду вам очень признателен.заранее спасибо!!!
DOM
Сообщения: 35
Зарегистрирован: 18 апр 2008, 01:59

Чтобы точки появлялись, я то могу сделать, но они только одного цвета и появляются где попало, а не в квадрате))помогите чем можете плиз))
MOTOCoder
Сообщения: 548
Зарегистрирован: 14 янв 2008, 20:27
Откуда: Россия, Псков

1. Добавить переменные

Код: Выделить всё

w,h,yy,xx,dx,dy:integer;
2. В конце процедуры StarLine добавить блок инициализации переменных
[syntax='Delphi']
xx:=p[5].x;
yy:=p[5].Y;
w:=p[11].x-p[5].x;
h:=p[9].y-p[3].Y;
[/syntax]

3. Добавить на форму таймер, установив свойство enabled в False, в Button1.Click после вызова StarLine добавить

Код: Выделить всё

Timer1.Enabled:=true;
4. В обработчике Timer1.OnTimer разместить код
[syntax='Delphi']
dx:=random(w);
dy:=random(h);
dx:=xx+dx;
dy:=yy+dy;
if Canvas.Pixels[dx,dy]=clred then
Canvas.Pixels[dx,dy]:=Random(maxint);
[/syntax]

В роде бы все.
Ни что так не ограничивает фантазию программиста, как компилятор...
DOM
Сообщения: 35
Зарегистрирован: 18 апр 2008, 01:59

А можно как-то без таймера обойтись...например при нажатии на кнопку каждый раз рисуются произвольно точки???
MOTOCoder
Сообщения: 548
Зарегистрирован: 14 янв 2008, 20:27
Откуда: Россия, Псков

DOM писал(а):А можно как-то без таймера обойтись...например при нажатии на кнопку каждый раз рисуются произвольно точки???


Можно(нужно переписать код обработчика таймера в обработчик OnClick кнопки), но вероятность попадания точки в звезду невелика, поэтому, чтобы увидеть хотя бы несколько точек, придется нажать кнопку много раз. По-моему с таймером лучше.
Ни что так не ограничивает фантазию программиста, как компилятор...
DOM
Сообщения: 35
Зарегистрирован: 18 апр 2008, 01:59

а как еще сделать так, что точки, которые попадают на здезду окрашиваются в красный цвет или вообще не появляются?
MOTOCoder
Сообщения: 548
Зарегистрирован: 14 янв 2008, 20:27
Откуда: Россия, Псков

А, это я перепутал. В условии if Canvas.Pixels[dx,dy]=clred then нужно заменить = на <>.
Ни что так не ограничивает фантазию программиста, как компилятор...
Ответить