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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.06.2008, 10:10   #1
Taisja
Пользователь
 
Регистрация: 31.05.2008
Сообщений: 25
Печаль Помогите разобраться в поверхности: цилиндр это или нет

Препод мне сказал, что это должен быть цилиндр. А у меня какая-то ерунда получается. Помогите пожалуйста разобраться. Из-за этого мне зачет не ставят, сказали переделать, завтра сдать.
Нужно построить поверхность: x*x/a*a+y*y/b*b-z*z/c*c=1

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
const al=0.71;
var
x,y,z:real;
mx,my,mz:real;
xmax,ymax,xmin,ymin,zmax,zmin:real;
xy,yy:integer;
xgmin,xgmax,ygmin,ygmax,zgmax,zgmin :integer;
a,b,c:integer;
i,j,n,m:integer;
x0,y0:integer;
hx,hy:real;
function f(x,y:real;var a,b,c:integer):real;
begin //поверхность x*x/a*a+y*y/b*b-z*z/c*c=1
f:=sqrt(abs((c*c)*(-1+(x*x)/(a*a)+(y*y)/(b*b))));
end;
begin
a:=strtoint(inputbox('окно ввода','введи a',' '));
b:=strtoint(inputbox('окно ввода','введи b',' '));
c:=strtoint(inputbox('окно ввода','введи c',' '));
xmin:=2; xmax:=10;
ymin:=-10; ymax:=20;
zmin:=-20; zmax:=20;
xgmin:=150; xgmax:=500;
ygmin:=200; ygmax:=500;
zgmax:=500 ; zgmin:=200;

x0:=(xgmin+xgmax)div 2;
y0:=(ygmin+ygmax)div 2;
mx:=(xgmax-xgmin)/(xmax-xmin);
my:=(ygmax-ygmin)/(ymax-ymin);
mz:=(zgmax-zgmin)/(zmax-zmin);
hx:=1/mx;
hy:=1/my;
n:=round((xmax-xmin)/hx);
m:=round((ymax-ymin)/hy);
x:=xmin; y:=ymin;
with canvas do
begin
moveto(xgmin,y0);
lineto(xgmax,y0);
moveto(x0,y0);
lineto(x0,ygmin);
moveto(xgmax,y0-round((xgmax-x0)*sin(al)/cos(al)));
lineto(xgmin,y0+round((x0-xgmin)*sin(al)/cos(al)));
textout(xgmax,x0,'X');
textout(x0+5,200,'Z');
textOut(y0,x0+5,'0');
textOut(200,420,'Y');
for i:=1 to n do
begin
for j:=1 to n do
begin
xy:=x0+round(mx*x)-round(my*y*cos(al));
yy:=y0+round(my*y*sin(al))-round(mz*f(x,y,a,b,c));
canvas.Pixels[xy,yy]:=clpurple;
x:=xmin-j*hx;
end;
y:=ymin+i*hy;
end;
end;
end;

end.

Последний раз редактировалось Taisja; 18.06.2008 в 10:52.
Taisja вне форума Ответить с цитированием
Старый 18.06.2008, 11:21   #2
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Попробуйте вот это:
Код:
procedure TForm1.FormPaint(Sender: TObject);
const al = pi/4;

 // x^2/a^2 + y^2/b^2 - z^2/c^2 = 1
 // однопОлостный гиперболоид
 // для заданных x, y точки на поверхности может не существовать
 // - функция возвращает false
 // или существует 2 точки - z1, z2
 function f(a,b,c:integer; x,y:real; var z1, z2 :real):boolean;
 var m:real;
 begin
    z1 := 0; z2 := 0;

    m := ((x*x)/(a*a)+(y*y)/(b*b) -1) * (c*c);
    result := (m >= 0) and (m < 1e37);
    if not result then exit;

    z1 := sqrt(m);
    z2 := -z1;
 end;

var a, b, c:integer;
    x1, y1, x0, y0, m:integer;
    x, y, dx, dy, z1, z2:real;
begin
   // Задание параметров поверхности
   a := 10; //strtoint(inputbox('окно ввода','введи a',' '));
   b := 10; //strtoint(inputbox('окно ввода','введи b',' '));
   c := 15; //strtoint(inputbox('окно ввода','введи c',' '));

   // центр системы координат - в центре формы
   x0 := width div 2;
   y0 := height div 2;

   // Рисуем систему координат
   canvas.MoveTo(x0-10, y0); canvas.lineTo(width-50, y0); canvas.textout(width-40,y0,'X');
   canvas.MoveTo(x0, y0+10); canvas.lineTo(x0, 0+50);     canvas.textout(x0, 0+40, 'Z');
   canvas.MoveTo(x0+trunc(10*sin(al)), trunc(y0-10*cos(al)));
   x1 := x0-trunc(y0*sin(al));
   y1 := y0+trunc(y0*cos(al));
   canvas.lineTo(x1, y1);
   canvas.textout(x1, y1, 'Y');

   m := 2;   // масштабный коэффициент

   dx := 1;
   dy := 1;
   x := -100;
   while x <= 100 do begin
      y := -100;
      while y <= 100 do begin

         if f(a, b, c, x, y, z1, z2) then begin

            x1 := trunc(x0 + m*x - m*y*cos(al));
            y1 := trunc(y0 + m*y*cos(al)- m*z1);
            canvas.Pixels[x1,y1] := clpurple;

            x1 := trunc(x0 + m*x - m*y*cos(al));
            y1 := trunc(y0 + m*y*cos(al)- m*z2);
            canvas.Pixels[x1,y1] := clpurple;

         end;

         y := y + dy;
      end;
      x := x + dx;
   end;
end;
О самой поверхности посмотрите --> Гиперболоид

еще можно имитировать глубину, сделав цвет зависимым от y и обрезать изображение по z.

Код:
    CL:byte;
    C1:TColor;

   while x <= 100 do begin
      y := 100;
      while y >= -100 do begin

         if f(a, b, c, x, y, z1, z2) then begin

            if abs(z1) < 100 then begin
               CL := $FF - trunc($FF*(y+100)/200);
               C1 := CL shl 16 + CL shl 8 + CL;
           
               x1 := trunc(x0 + m*x - m*y*cos(al));
               y1 := trunc(y0 + m*y*cos(al)- m*z1);
               canvas.Pixels[x1,y1] := C1;
           
               x1 := trunc(x0 + m*x - m*y*cos(al));
               y1 := trunc(y0 + m*y*cos(al)- m*z2);
               canvas.Pixels[x1,y1] := C1;
            end;

         end;

         y := y - dy;
      end;
      x := x + dx;
   end;

Последний раз редактировалось alexBlack; 18.06.2008 в 13:01.
alexBlack вне форума Ответить с цитированием
Старый 18.06.2008, 18:26   #3
Taisja
Пользователь
 
Регистрация: 31.05.2008
Сообщений: 25
По умолчанию

Большущее спасибо!!! Вы уже в который раз меня спасаете.
Taisja вне форума Ответить с цитированием
Старый 18.06.2008, 19:09   #4
zetrix
Delphi/C++/C#
Участник клуба
 
Аватар для zetrix
 
Регистрация: 29.10.2006
Сообщений: 1,972
По умолчанию

МатЛаб строит подобное запросто. Это не цилиндр конечно же. (видно их уравнения).

Скажите, а что уравнение цилиндра вообще существует? ))

Последний раз редактировалось zetrix; 18.06.2008 в 19:14.
zetrix вне форума Ответить с цитированием
Старый 18.06.2008, 20:23   #5
Taisja
Пользователь
 
Регистрация: 31.05.2008
Сообщений: 25
По умолчанию

Вообще-то существует, выглядит так
x*x/a*a+y*y/b*b=1 - эллиптический цилиндр
x*x/a*a-y*y/b*b=1 - гиперболический цилиндр
y*y=2*p*x - параболический цилиндр
Я сама удивилась, когда мне сказали, что это цилиндр, видимо перепутали малость.
Taisja вне форума Ответить с цитированием
Старый 18.06.2008, 20:58   #6
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Ошибочная запись.

Последний раз редактировалось puporev; 18.06.2008 в 21:01.
puporev вне форума Ответить с цитированием
Старый 18.06.2008, 21:10   #7
Taisja
Пользователь
 
Регистрация: 31.05.2008
Сообщений: 25
По умолчанию

А почему ошибочная? Объясните пожалуйста.
Taisja вне форума Ответить с цитированием
Старый 18.06.2008, 21:12   #8
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Это я ошибся с записью, удалил ее и написал, что она ошибочная, если кто-то уже прочитал.
puporev вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Найти объём куба и площадь его боковой поверхности BASIC Ветренная Помощь студентам 23 02.06.2008 13:15
OpenGL (цилиндр) -=<[Evklidd]>=- Gamedev - cоздание игр: Unity, OpenGL, DirectX 7 01.02.2008 13:51
Help!!!Движение точки по поверхности сферы alex23xandr Помощь студентам 4 20.05.2007 14:45