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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.11.2008, 00:04   #1
shorox
 
Регистрация: 08.11.2008
Сообщений: 4
По умолчанию Нарисовать на канве однополосный гиперболоид

Граждане помогите, никак не могу создать изображение однополостного гиперболоида на канве, так же нужно реализовать процедуры для 5 кнопок, 2 из них масштабирование фигуры, а 3 - поворот по осям. Заранее спасибо всем помогающим.

Последний раз редактировалось shorox; 30.11.2008 в 00:21.
shorox вне форума Ответить с цитированием
Старый 30.11.2008, 00:39   #2
Summerrain
Пользователь
 
Аватар для Summerrain
 
Регистрация: 16.11.2008
Сообщений: 21
По умолчанию

гиперболоида не знаю. А вот как двигать простой треугольник при помощи кнопок по форме показать могу.
Summerrain вне форума Ответить с цитированием
Старый 30.11.2008, 00:48   #3
Summerrain
Пользователь
 
Аватар для Summerrain
 
Регистрация: 16.11.2008
Сообщений: 21
По умолчанию

Посмотри вот эту программу может что нить и найдешь для себя полезного )))
Вложения
Тип файла: rar Прога.rar (261.3 Кб, 33 просмотров)
Summerrain вне форума Ответить с цитированием
Старый 30.11.2008, 01:04   #4
shorox
 
Регистрация: 08.11.2008
Сообщений: 4
По умолчанию

Summerrain спасибо канешн но это далеко не то
Как приближенный пример

Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Image1: TImage;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    Button6: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
  vector=array[1..3] of real;
  projection=array[1..2] of vector;
  matr3x3=array[1..3,1..3] of real;

var
  Form1: TForm1;
  x_center,y_center:integer;
  x,y,z,xstep,ystep,theta:real;
  i,j,xold,yold,xnew,ynew,xmin,xmax,ymin,ymax,xcount,ycount:integer;
  p:projection;

procedure norm_line(x0,y0,x1,y1:integer);
procedure computer_oblique_matrix(alpha:real; var p:projection);
procedure project(const p:projection; const x,y,z:real; const u0,v0:integer; var u,v:integer);
function f(x,y:real):real;
procedure scrcoord(var x,y:real; var xnew,ynew:integer);
procedure draw_surf;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  xcount:=50;
  ycount:=50;
  xmin:=-100;
  xmax:=100;
  ymin:=-100;
  ymax:=100;
  image1.Width:=form1.ClientWidth;
  image1.Height:=form1.ClientHeight-40;
  image1.Canvas.Rectangle(0,0,image1.Width,image1.Height);
  x_center:=(image1.Width+1) div 2;
  y_center:=(image1.Height+1) div 2;
  theta:=45;
  computer_oblique_matrix(theta,p);
  draw_surf;
end;

procedure norm_line(x0,y0,x1,y1:integer);
begin
  form1.Image1.Canvas.MoveTo(x0+x_center,y_center-y0);
  form1.Image1.Canvas.LineTo(x1+x_center,y_center-y1);
end;

procedure computer_oblique_matrix(alpha:real; var p:projection);
begin
  alpha:=pi*alpha/180;
  p[1,1]:=-sin(alpha);
  p[1,2]:=1;
  p[1,3]:=0;
  p[2,1]:=-cos(alpha);
  p[2,2]:=0;
  p[2,3]:=1;
end;

procedure project(const p:projection; const x,y,z:real; const u0,v0:integer; var u,v:integer);
begin
  u:=u0+round(p[1,1]*x+p[1,2]*y+p[1,3]*z);
  v:=v0+round(p[2,1]*x+p[2,2]*y+p[2,3]*z);
end;

function f(x,y:real):real;
begin
  f:=cos(sqrt(x*x+y*y));
end;

procedure scrcoord(var x,y:real; var xnew,ynew:integer);
begin
  z:=10*f(0.1*x,0.1*y);
  project(p,x,y,z,0,0,xnew,ynew);
end;

procedure draw_surf;
begin
  xstep:=(xmax-xmin)/xcount;
  ystep:=(ymax-ymin)/ycount;
  for i:=0 to xcount do
  begin
    x:=xmin+i*xstep;
    y:=ymin;
    scrcoord(x,y,xnew,ynew);
    xold:=xnew;
    yold:=ynew;
    for j:=0 to ycount do
    begin
      y:=ymin+j*ystep;
      scrcoord(x,y,xnew,ynew);
      norm_line(xnew,ynew,xold,yold);
      xold:=xnew;
      yold:=ynew;
    end;
  end;
  for i:=0 to ycount do
  begin
    y:=ymin+i*ystep;
    x:=xmin;
    scrcoord(x,y,xnew,ynew);
    xold:=xnew;
    yold:=ynew;
    for j:=0 to xcount do
    begin
      x:=xmin+j*xstep;
      scrcoord(x,y,xnew,ynew);
      norm_line(xnew,ynew,xold,yold);
      xold:=xnew;
      yold:=ynew;
    end;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  xmin:=xmin-10;
  xmax:=xmax+10;
  ymin:=ymin-10;
  ymax:=ymax+10;
  image1.Canvas.FillRect(rect(0,0,image1.Width,image1.Height));
  draw_surf;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  if (xmin<0) and (xmax>0) then
  begin
    xmin:=xmin+10;
    xmax:=xmax-10;
    ymin:=ymin+10;
    ymax:=ymax-10;
    image1.Canvas.FillRect(rect(0,0,image1.Width,image1.Height));
    draw_surf;
  end;
end;

end.

Только тут кнопки поворота не работают (поскольку процедур для них не написано) и график совсем другой выводит
shorox вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Рисование пирамиды на канве Eugene Общие вопросы Delphi 4 17.10.2013 17:27
Мерцание на Канве SERG1980 Мультимедиа в Delphi 3 30.04.2008 08:14
Поворот маленького примитива на канве valwin Общие вопросы Delphi 7 04.02.2007 03:34
построение графика на Канве Chepa Общие вопросы Delphi 2 19.01.2007 22:59
как рисовать на канве битмапы учитывая прозрачность участков битмапа? Alar Общие вопросы Delphi 0 29.10.2006 23:06