Alvin Seville
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 9
1

Вращающийся куб

10.08.2017, 17:39. Показов 3399. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Почему куба вообще нет? Как исправить?
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
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
uses GraphABC;
 
const
  n = 8;
  R = 1;
  W = 500;
  H = 500;
  Dist = 10;
  
type
  Point3D = class
    X, Y, Z: real;
    constructor(px, py, pz: real);
    begin
      X := px;
      Y := py;
      Z := pz;
    end;
  end;
 
var
  Points3D: array [0..n - 1] of Point3D;
  Points2D: array [0..n - 1] of Point;
 
{sx = xSize/2+x*dist/(z+dist),
 sy = ySize/2-y*dist/(z+dist).}
 
procedure Project(i: integer);
var
  sx, sy: Integer;
begin
  try
    Points2D[i].X := Trunc(W / 2 + Points3D[i].X * dist / (Points3D[i].Z + dist));
    Points2D[i].Y := Trunc(H / 2 - Points3D[i].Y * dist / (Points3D[i].Z + dist));
  except end;
end;
 
begin
  SetWindowIsFixedSize(true);
  SetWindowSize(W, H);
  LockDrawing();
  SetSmoothingOff();
  
  for var i := 0 to n - 1 do Points3D[i] := new Point3D(0, 0, 0);
  for var i := 0 to n - 1 do Points2D[i] := new Point(0, 0);
  
  while true do
  begin
    for var a := 0 to 360 do
    begin
      ClearWindow();
      for var angle := 0 to 3 do
        for var i := 0 to 3 do
        begin
          Points3D[i].X := R * Cos(DegToRad(angle * 90 + a));
          Points3D[i].Y := R * Sin(DegToRad(angle * 90 + a));
          Points3D[i].Z := R;
          Project(i);
        end;
      
      for var angle := 0 to 3 do
        for var i := 4 to n-1 do
        begin
          Points3D[i].X := R * Cos(DegToRad(angle * 90 + a));
          Points3D[i].Y := R * Sin(DegToRad(angle * 90 + a));
          Points3D[i].Z := -R;
          Project(i);
        end;
      
      for var i := 0 to n - 1 do
        for var j := 0 to n - 1 do
          if i <> j then
            Line(Points2D[i].X, Points2D[i].Y, Points2D[j].X, Points2D[j].Y);
      Redraw();
      Sleep(100);
    end;
  end;
end.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.08.2017, 17:39
Ответы с готовыми решениями:

Изобразить на экране прямоугольник, вращающийся в плоскости экрана вокруг своего центра
Здравствуйте. Помогите решить задачу. Изобразить на экране прямоугольник, вращающийся в...

Изобразить на экране прямоугольник, вращающийся в плоскости экрана вокруг своего центра
Здравствуйте. Помогите решить задачу. Изобразить на экране прямоугольник, вращающийся в...

Изобразить на экране прямоугольник, вращающийся в плоскости экрана вокруг своего центра
Здравствуйте. Помогите решить задачу. Изобразить на экране прямоугольник, вращающийся в...

Изобразить на экране правильный треугольник, вращающийся в плоскости экрана вокруг своего центра
Изобразить на экране правильный треугольник, вращающийся в плоскости экрана вокруг своего центра....

12
5077 / 2649 / 2349
Регистрация: 10.12.2014
Сообщений: 10,024
11.08.2017, 07:26 2
Цитата Сообщение от Volobuev Ilya Посмотреть сообщение
Почему куба вообще нет? Как исправить?
Потому, что эта программа вами просто от куда-то слямзена!
И вы без понятия как она работает!!!
Для начала смотрите сюды:
Pascal
5
  R = 9;
0
Alvin Seville
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 9
11.08.2017, 11:08  [ТС] 3
Цитата Сообщение от JuriiMW Посмотреть сообщение
Потому, что эта программа вами просто от куда-то слямзена!
Вообще то, я ее сам писал, и пытался по формулам (закоментированы) написать код. Ничего доказывать, я Вам не собераюсь, особенно в области авторства программы.

Добавлено через 2 минуты
Так, можно узнать причину того, что рисуется не то, что надо? Что надо исправить?
0
5077 / 2649 / 2349
Регистрация: 10.12.2014
Сообщений: 10,024
14.08.2017, 10:58 4
Лучший ответ Сообщение было отмечено Volobuev Ilya как решение

Решение

Цитата Сообщение от Volobuev Ilya Посмотреть сообщение
Что надо исправить?
Я же указал, что для начала нужно исправить!


Непонятные (для меня ;–) преобразования в строках 52…68.
Плюс непонятные (для меня ;–) действия при инициализации объекта.

Вот полностью переписанная программа:
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
41
42
43
44
45
46
47
48
49
uses GraphABC; 
 
const
  L = 100;
  distance = 400;
 
type
  pix3D = record
    X,Y,Z : Real;
    
    constructor; begin (X, Y, Z) := (0, 0, 0); end;
    constructor (X, Y, Z : Real); begin (Self.X, Self.Y, Self.Z) := (X, Y, Z); end;
    
    function rotationX(angle : Real) := new pix3D(X, Y*cos(angle)+Z*sin(angle), -Y*sin(angle)+z*cos(angle));
    function rotationY(angle : Real) := new pix3D(X*cos(angle)-z*sin(angle), Y, X*sin(angle)+Z*cos(angle));
    function rotationZ(angle : Real) := new pix3D(X*cos(angle)+Y*sin(angle), -X*sin(angle)+Y*cos(angle), Z);
    
    function winX := Window.Center.X + Round(X * distance / (Z + distance));
    function winY := Window.Center.Y + Round(Y * distance / (Z + distance));
  end;
 
var pix : array of pix3D = (
  new pix3D(+L,+L,+L), new pix3D(+L,+L,-L), new pix3D(+L,-L,+L), new pix3D(+L,-L,-L),
  new pix3D(-L,+L,+L), new pix3D(-L,+L,-L), new pix3D(-L,-L,+L), new pix3D(-L,-L,-L)
);
 
procedure Li(a, b : pix3D) := Line(a.winX, a.winY, b.winX, b.winY);
 
procedure DrawCube(angleX, angleY, angleZ : Real);
begin
  var r : array of pix3D;
  SetLength(r, 8);
  for var i := 0 to 7 do r[i] := pix[i].rotationX(angleX).rotationY(angleY).rotationZ(angleZ);
  Li(r[0],r[1]); Li(r[0],r[2]); Li(r[1],r[3]); Li(r[2],r[3]); Li(r[0],r[4]); Li(r[1],r[5]);
  Li(r[4],r[5]); Li(r[2],r[6]); Li(r[4],r[6]); Li(r[3],r[7]); Li(r[5],r[7]); Li(r[6],r[7]);
end;
 
begin
  Randomize;
  var (rotX, rotY, rotZ) := (0.0, 0.0, 0.0);
  LockDrawing;
  repeat
    Window.Clear;
    rotX += Random/40; rotY += Random/40; rotZ += Random/40;
    DrawCube(rotX, rotY, rotZ);
    Redraw;
    Sleep(10);
  until False;
end.
Volobuev Ilya, ваше здесь только преобразование мировых координат в экранные… Да и то, переделанные под реалии данной моей программы ;–)

P.S. Ресайзинг формы специально не отключен! Куб всегда остаётся в центре формы.
1
617 / 937 / 150
Регистрация: 10.08.2015
Сообщений: 4,983
19.08.2017, 02:03 5
Цитата Сообщение от JuriiMW Посмотреть сообщение
var (rotX, rotY, rotZ) := (0.0, 0.0, 0.0);
Можно объяснить эту строчку? у меня она вызывает ошибку
0
2 / 2 / 2
Регистрация: 28.04.2017
Сообщений: 71
19.08.2017, 16:17 6
vlisp, у меня тоже, но, скорее всего, это аналогично этому:
Pascal
1
2
3
var rotx:=0.0;
var roty:=0.0;
var rotz:=0.0;
0
617 / 937 / 150
Регистрация: 10.08.2015
Сообщений: 4,983
19.08.2017, 16:46 7
Цитата Сообщение от ko2101 Посмотреть сообщение
скорее всего, это аналогично этому
Да, так работает. Но это не интересная конструкция. Больше интересует то, что было написано изначально. Во первых если это не работает, то вероятно JuriiMW программу даже не запускал. Если работает, то как заставить ее работать? И почему тогда в конструкторе выше подобная конструкция не вызывает ошибки.
0
5077 / 2649 / 2349
Регистрация: 10.12.2014
Сообщений: 10,024
21.08.2017, 06:37 8
Цитата Сообщение от vlisp Посмотреть сообщение
то вероятно JuriiMW программу даже не запускал
Попрошу без инсинуаций!
Вместо того, чтобы пенять на нерабочий код, попробовали бы обновить IDE !

В конце мая или начале июня появилась возможность использования var для всего кортежа, если что 8–)
0
617 / 937 / 150
Регистрация: 10.08.2015
Сообщений: 4,983
21.08.2017, 06:57 9
Цитата Сообщение от JuriiMW Посмотреть сообщение
Попрошу без инсинуаций!
Только недавно подумалось, что это PascalABC.NET не обновлялся давно. Иногда мы не замечаем очевидные вещи
0
15 / 13 / 3
Регистрация: 20.08.2017
Сообщений: 32
27.08.2017, 16:07 10
Илья, пишите уже так:

Pascal
1
2
3
4
5
6
7
8
9
10
uses Graph3D;
 
begin
  var куб := Cube(0,0,1,2,Colors.Green);
  while True do
  begin
    куб.Rotate(v3D(0,0,1),1);
    Sleep(10);
  end;
end.
1
Alvin Seville
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 9
01.09.2017, 17:39  [ТС] 11
Не люблю когда используются русским идентификаторы, но и на этом спасибо.
Жалко, что нет документации по этому Graph3D...
0
0 / 0 / 0
Регистрация: 22.11.2015
Сообщений: 56
25.11.2017, 22:35 12
Не могли вы помочь с раскраской данного куба?)
0
15 / 13 / 3
Регистрация: 20.08.2017
Сообщений: 32
28.11.2017, 04:09 13
Раскраска граней пока не работает
0
28.11.2017, 04:09
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.11.2017, 04:09
Помогаю со студенческими работами здесь

Нарисуйте куб
Нарисуйте пожалуйста куб как на картинке.

Изобразить отрезок, вращающийся вокруг точки
Изобразить на экране отрезок, вращающийся в плоскости экрана вокруг точки, делящей отрезок в...

Прямоугольник, вращающийся на плоскости экрана вокруг своей оси
Изобразить на экране прямоугольник, вращающийся в плоскости экрана вокруг своего центра

Изобразить равнобедренный треугольник, вращающийся с постоянной угловой скоростью вокруг своей высоты
Изобразить равнобедренный треугольник, вращающийся с постоянной угловой скоростью вокруг своей...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru