Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.08.2010, 21:14   #1
lex1398
 
Регистрация: 02.10.2009
Сообщений: 6
По умолчанию фигура-грани

Подсобите как закрасить грани фигуры разными цветами!!

Код прилагается..

Код:
unit Unit1;

interface

uses Windows, Classes, Graphics, Forms, Buttons, Controls, ExtCtrls,
  StdCtrls;

type
  TForm1 = class(TForm)
    Timer: TTimer;
    PaintBox: TPaintBox;
    Panel1: TPanel;
    sbtRotateYZf: TSpeedButton;
    sbtRotateYZt: TSpeedButton;
    sbtRotateXZf: TSpeedButton;
    sbtRotateXZt: TSpeedButton;
    sbtRotateXYf: TSpeedButton;
    sbtRotateXYt: TSpeedButton;
    Button1: TButton;
    procedure PaintBox_onPaint(Sender: TObject);
    procedure TimerTimer(Sender: TObject);
    procedure sbtRotate_onMouseDown(Sender: TObject; Button: TMouseButton;    Shift: TShiftState; X, Y: Integer);
    procedure sbtRotate_onMouseUp(Sender: TObject; Button: TMouseButton;    Shift: TShiftState; X, Y: Integer);
    procedure Form_onCreate(Sender: TObject);
    procedure Form_onResize(Sender: TObject);
    procedure Button1Click(Sender: TObject);

  private
    FFillColor : TColor;
  public



  end;

var
  Form1: TForm1;
  RotateXYt,RotateXYf,RotateXZt,RotateXZf,RotateYZt,RotateYZf:boolean;

implementation
{$R *.DFM}
const
   mOkt=6;
Type
  TMain = record
            X, Y, Z  : double;
            Sd       : array[1..3] of byte;
            Xe, Ye   : Integer;
          end;
  TOkt  = array[1..mOkt]  of TMain;
const
   R=15;
   A=r*0.8660254;
   H=r*0.5;
     Okt : TOkt = (
 {1}  (X :  -R;   Y:  0;   Z:  0;    Sd:(6,2,4)),
 {2}  (X :   0;   Y:  0;   Z: -R;    Sd:(6,3,5)),
 {3}  (X :   R;   Y:  0;   Z:  0;    Sd:(6,4,5)),
 {4}  (X :   0;   Y:  0;   Z:  R;    Sd:(6,5,0)),
 {5}  (X :   0;   Y: -R;   Z:  0;    Sd:(1,0,0)),
 {6}  (X :   0;   Y:  R;   Z:  0;    Sd:(0,0,0))
 );
Var
 dxy,dxz,dyz   : double;  // Угол поворота по осям
 Fok  : integer = 800;  // Фокусное расстояние

 procedure XYZ(X,Y,Z  : double; Var X2,Y2  : integer);
begin
   X2:=Round(X*Fok/100+(Form1.PaintBox.Width div 2));
   Y2:=Round(Y*Fok/100+(Form1.PaintBox.Height div 2));
end;

procedure Pw(var X,Y : double; Al  : double);
var
   X2, Y2 : double;
   sina, cosa : double;
begin
   if Al=0 then Exit;
   sina :=sin(Al); cosa:=cos(Al);
   X2:=(X*Cosa-Y*Sina);
   Y2:=(X*Sina+Y*Cosa);
   X:=X2; Y:=Y2;
end;

procedure TForm1.PaintBox_onPaint(Sender: TObject);
var i,j,c    : integer;
    qOkt:TOkt;
begin

      qOkt:=Okt;
       for i:=1 to mOkt do begin
          Pw(qOkt[i].X, qOkt[i].Y, dxy);
          Pw(qOkt[i].X, qOkt[i].Z, dxz);
          Pw(qOkt[i].Y, qOkt[i].Z, dyz);
          XYZ(qOkt[i].X, qOkt[i].Y, qOkt[i].Z, qOkt[i].Xe, qOkt[i].Ye);
       end;
       for i:=1 to mOkt do
          for j:=1 to 3 do
             if qOkt[i].Sd[J]<>0 then begin
                c:=qOkt[i].Sd[j];
                with PaintBox.Canvas do begin
                   MoveTo(qOkt[i].Xe, qOkt[i].Ye);
                   LineTo(qOkt[c].Xe, qOkt[c].Ye);
                end;
             end;
    end;


procedure TForm1.TimerTimer(Sender: TObject);
const N:real=0.03;
begin
     if RotateXYt then dxy:=dxy+N;
     if RotateXZt then dxz:=dxz+N;
     if RotateYZt then dyz:=dyz+N;
     if RotateXYf then dxy:=dxy-N;
     if RotateXZf then dxz:=dxz-N;
     if RotateYZf then dyz:=dyz-N;
     if (RotateXYt or RotateXYf or RotateXZt or RotateXZf  or RotateYZt or RotateYZf) then PaintBox.Repaint;
end;

procedure TForm1.sbtRotate_onMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
    if Sender=sbtRotateXYt then RotateXYt:=true;
    if Sender=sbtRotateXYf then RotateXYf:=true;
    if Sender=sbtRotateXZt then RotateXZt:=true;
    if Sender=sbtRotateXZf then RotateXZf:=true;
    if Sender=sbtRotateYZt then RotateYZt:=true;
    if Sender=sbtRotateYZf then RotateYZf:=true;


    end;
procedure TForm1.sbtRotate_onMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
    if Sender=sbtRotateXYt then RotateXYt:=false;
    if Sender=sbtRotateXYf then RotateXYf:=false;
    if Sender=sbtRotateXZt then RotateXZt:=false;
    if Sender=sbtRotateXZf then RotateXZf:=false;
    if Sender=sbtRotateYZt then RotateYZt:=false;
    if Sender=sbtRotateYZf then RotateYZf:=false;

   end;



procedure TForm1.Form_onCreate(Sender: TObject);
begin
      dxy:=0.3; dyz:=0.3; dxz:=0.3;
      RotateXYt:=false;
      RotateXYf:=false;
      RotateXZt:=false;
      RotateXZf:=false;
      RotateYZt:=false;
      RotateYZf:=false;
end;

procedure TForm1.Form_onResize(Sender: TObject);
begin
     Fok:=Round((Width+Height)*0.8);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Close;
end;


end.

Последний раз редактировалось Stilet; 27.08.2010 в 08:55.
lex1398 вне форума Ответить с цитированием
Старый 27.08.2010, 13:38   #2
dexterua
Пользователь
 
Регистрация: 16.11.2009
Сообщений: 24
По умолчанию

Код большой, разбираться подробно лень, но вы используете для рисования:
Код:
with PaintBox.Canvas do begin
MoveTo(qOkt[i].Xe, qOkt[i].Ye);
LineTo(qOkt[c].Xe, qOkt[c].Ye);
Код:
PaintBox.Canvas.Pen.Width:=3; //толщина линии
PaintBox.Canvas.Pen.Color:=clNavy; //цвет линии
PaintBox.Canvas.Brush.Color:=clWhite; //цвет фона
меняйте в том месте на другое значение в зависимости от номера грани, или еще чего и будет рисовать другим цветом/толщиной
dexterua вне форума Ответить с цитированием
Старый 28.08.2010, 09:54   #3
lex1398
 
Регистрация: 02.10.2009
Сообщений: 6
По умолчанию

А как каждую сторону закрасить отдельно??
lex1398 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
фигура должна передвигаться по экрану и отбиваться от стенок rUs_LAN Общие вопросы C/C++ 1 06.02.2010 15:51
Определить является ли фигура равносторонним треугольником? Alexsssandr Помощь студентам 2 04.11.2009 17:24
Определить видимость грани многоугольника Sergey2 Помощь студентам 4 26.06.2009 20:46
Помогите!!! Паскаль, графическая фигура!!!! 311 Помощь студентам 4 24.01.2009 03:39
Фигура не поворачивает на клавишах! heavenly Мультимедиа в Delphi 8 10.11.2008 21:01