Форум программистов, компьютерный форум, киберфорум
Delphi: Графика, звук, видео
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
0 / 0 / 4
Регистрация: 21.08.2017
Сообщений: 184
1

Написание функции для создания точек внутри куба и сферы: перевод кода из C++ в Delphi

20.09.2019, 11:55. Просмотров 1554. Ответов 22

Добрый день! В лабораторной работе мне дали задание - создать три трекбара и поместить тысячу точек внутри куба и сферы с кодом на C++:

C++
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
void __fastcall TForm1::Button1Click(TObject *Sender)
{
        TGLPoints *P[100];
        for(int i=0;i<100;i++)
        {
          P[i]=new TGLPoints(GLDummyCube1);
          P[i]->Colors->Add(((float)(rand()%256))/256.0,
                                           ((float)(rand()%256))/256.0,
                                           ((float)(rand()%256))/256.0,0.5);
          P[i]->Size=5;
          P[i]->Position->X=1.0*rand()/RAND_MAX-0.5;
          P[i]->Position->Y=1.0*rand()/RAND_MAX-0.5;
          P[i]->Position->Z=1.0*rand()/RAND_MAX-0.5;
        }
}
//Поворот  куба интерактивно
//---------------------------------------------------------------------------
void __fastcall TForm1::TrackBar1Change(TObject *Sender)
{
GLDummyCube1->PitchAngle=TrackBar1->Position; }
void __fastcall TForm1::TrackBar2Change(TObject *Sender) {
GLDummyCube1->RollAngle=TrackBar2->Position; }
void __fastcall TForm1::TrackBar3Change(TObject *Sender) {
GLDummyCube1->TurnAngle=TrackBar3->Position; }
//---------------------------------------------------------------------------
Но это только для даммикуба, а я пытаюсь сделать для того объекта, на который смотрит камера. Вдобавок, на C++ возникли ошибки с адаптером OpenGLAdapter, из-за которых мне пришлось переходить на Delphi. В моём проекте есть две формы, а во второй - две камеры. Одна смотрит на куб, а другая - на сферу. Я сделал куб и сферу полупрозрачными, выставив свойство BlendingMode в главе Material в bmAdditive, и попытался сам перевести код на Delphi, но не понял, как создавать массив указателей, разыменовывать указатели, используя конструктор класса и генерировать случайные числа. Почему в C++ в функции Add генерируемое число переводится в тип float, а потом ещё и делится на 256.0, и какой аналог сишной переменной RANDOM_MAX, чтобы узнать максимальное число, которое может сгенерировать мой компилятор? Я брал 5000, но при нажатии кнопки Add ничего не вывелось.

Delphi
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
procedure TForm2.Button4Click(Sender: TObject);
var
P: array [0..99] of TGLPoints;
i: Integer;
begin
for i:=Low(P) to High(P) do
begin
P[i]:=TGLPoints.Create(Form2.GLSceneViewer1.Camera.TargetObject);
P[i].Colors.Add((Double(Random(256)))/256.0,
                   (Double(Random(256)))/256.0,
                   (Double(Random(256)))/256.0,0.5);
P[i].Size:=5;
P[i].Position.X:=1.0*Random(5000)/5000-0.5;
P[i].Position.Y:=1.0*Random(5000)/5000-0.5;
P[i].Position.Z:=1.0*Random(5000)/5000-0.5;
end;
end;
 
procedure TForm2.TrackBar1Change(Sender: TObject);
begin
Form2.GLSceneViewer1.Camera.TargetObject.PitchAngle:=TrackBar1.Position;
end;
 
procedure TForm2.TrackBar2Change(Sender: TObject);
begin
Form2.GLSceneViewer1.Camera.TargetObject.RollAngle:=TrackBar2.Position;
end;
 
procedure TForm2.TrackBar3Change(Sender: TObject);
begin
Form2.GLSceneViewer1.Camera.TargetObject.TurnAngle:=TrackBar3.Position;
end;
Как перевести код из C++ в Delphi, но не для даммикуба, а для объекта, на который смотрит камера? Скиньте, пожалуйста, книгу по GLScene, где есть пример функции для добавления точек в куб на Delphi. Ведь я не знаю, что искать - либо книг очень много, либо так мало, что пересчитаешь по пальцам, и всё равно не найдешь нужную информацию.

Код для первой формы:
Delphi
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
unit Lab1;
 
interface
 
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, GLScene, GLCoordinates, GLObjects, GLKeyboard, Math,
  GLWin32Viewer, GLCrossPlatform, GLBaseClasses, GLGeomObjects, Vcl.StdCtrls,
  GLCadencer, GLNavigator;
 
type
  TForm1 = class(TForm)
    GLScene1: TGLScene;
    GLSceneViewer1: TGLSceneViewer;
    GLCube1: TGLCube;
    GLCamera1: TGLCamera;
    GLLightSource1: TGLLightSource;
    GLCamera2: TGLCamera;
    GLTorus1: TGLTorus;
    GLLightSource2: TGLLightSource;
    Button1: TButton;
    Button2: TButton;
    GLCadencer1: TGLCadencer;
    GLCamera3: TGLCamera;
    Button3: TButton;
    Button4: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure GLCadencer1Progress(Sender: TObject; const deltaTime,
      newTime: Double);
    procedure GLSceneViewer1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure GLSceneViewer1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure Button3Click(Sender: TObject);
    procedure FormMouseWheel(Sender: TObject; Shift: TShiftState;
      WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
    procedure Button4Click(Sender: TObject);
  private
    { Private declarations }
  public
    mx,my: Integer;
  end;
  Coordinates = record
     X,Y,Z: double;
  end;
var
  Form1: TForm1;
  CubeObject: TGLCube;
  SphereObject: TGLSphere;
  dx,dy,dz: Integer;
implementation
 
{$R *.dfm}
 
uses Lab2;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
   GLSceneViewer1.Camera:=GLCamera1;
   Button1.Enabled:=False;
   Button2.Enabled:=True;
   Button3.Enabled:=True;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
   GLSceneViewer1.Camera:=GLCamera2;
   Button2.Enabled:=False;
   Button1.Enabled:=True;
   Button3.Enabled:=True;
end;
 
procedure TForm1.Button3Click(Sender: TObject);
begin
   GLSceneViewer1.Camera:=GLCamera3;
   Button3.Enabled:=False;
   Button1.Enabled:=True;
   Button2.Enabled:=True;
end;
 
procedure TForm1.Button4Click(Sender: TObject);
begin
Form2.Visible:=True;
Form1.Visible:=False;
end;
 
procedure TForm1.FormMouseWheel(Sender: TObject; Shift: TShiftState;
  WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
begin
if(GLSceneViewer1.MouseInControl=true) then GLSceneViewer1.Camera.AdjustDistanceToTarget(Power(1.1,-WheelDelta/120))
end;
 
procedure TForm1.GLCadencer1Progress(Sender: TObject; const deltaTime,
  newTime: Double);
begin
GLCube1.Turn(deltaTime*10);
GLTorus1.Turn(deltaTime*10);
//Движение вперед по клавишам ‘ц’ и’ w’
if (IsKeyDown('ц') OR IsKeyDown('w')) then GLSceneViewer1.Camera.Move(2* deltaTime);
//Движение назад по клавишам ‘ы’ и ‘s’
if (IsKeyDown('ы') OR IsKeyDown('s')) then GLSceneViewer1.Camera.Move(-2* deltaTime);
//Поворот влево по клавишам ‘ф’ и’ a’
if (IsKeyDown('ф') OR IsKeyDown('a')) then GLSceneViewer1.Camera.slide(-2* deltaTime);
//Поворот вправо по клавишам ‘в’ и ‘d’
if (IsKeyDown('в') OR IsKeyDown('d')) then GLSceneViewer1.Camera.slide(2* deltaTime);
//Движение вверх по клавишам ‘u’ и ‘г’
if (IsKeyDown('u') OR IsKeyDown('г')) then GLSceneViewer1.Camera.Lift(0.01);
//Движение вниз по клавишам ‘n’ и ‘т’
if (IsKeyDown('n') OR IsKeyDown('т')) then GLSceneViewer1.Camera.Lift(-0.01);
if (IsKeyDown('c') OR IsKeyDown('с')) then GLSceneViewer1.Camera:=GLCamera1;
if (IsKeyDown('v') OR IsKeyDown('м')) then GLSceneViewer1.Camera:=GLCamera2;
if (IsKeyDown('b') OR IsKeyDown('и')) then GLSceneViewer1.Camera:=GLCamera3
end;
 
procedure TForm1.GLSceneViewer1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  mx:=x; my:=y; //Запомнить координаты мыши
end;
 
procedure TForm1.GLSceneViewer1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if Shift<>[] then begin //Если нажата клавиша
  GLSceneViewer1.Camera.MoveAroundTarget(my-y, mx-x); //Перемещаем камеру вокруг целевого объекта
  GLLightSource1.Position:=GLSceneViewer1.Camera.Position; //Пусть источник освещения будет рядом с камерой
  mx:=x; my:=y;
  end;
end;
 
end.
Код для второй формы:
Delphi
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
unit Lab2;
 
interface
 
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Lab1, Vcl.StdCtrls, GLWin32Viewer, GLKeyboard, Math,
  GLCrossPlatform, GLBaseClasses, GLScene, GLObjects, GLCoordinates, GLCadencer,
  Vcl.ComCtrls;
 
type
  TForm2 = class(TForm)
    GLScene1: TGLScene;
    GLSceneViewer1: TGLSceneViewer;
    Button1: TButton;
    GLCadencer1: TGLCadencer;
    GLCamera1: TGLCamera;
    GLLightSource1: TGLLightSource;
    GLCube1: TGLCube;
    GLSphere1: TGLSphere;
    GLCamera2: TGLCamera;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    TrackBar1: TTrackBar;
    TrackBar2: TTrackBar;
    TrackBar3: TTrackBar;
    procedure Button1Click(Sender: TObject);
    procedure GLCube1Progress(Sender: TObject; const deltaTime,
      newTime: Double);
    procedure FormMouseWheel(Sender: TObject; Shift: TShiftState;
      WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
    procedure GLSceneViewer1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure GLSceneViewer1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure GLCadencer1Progress(Sender: TObject; const deltaTime,
      newTime: Double);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure TrackBar1Change(Sender: TObject);
    procedure TrackBar2Change(Sender: TObject);
    procedure TrackBar3Change(Sender: TObject);
    procedure Button4Click(Sender: TObject);
  private
    { Private declarations }
  public
    mx,my: Integer;
  end;
 
var
  Form2: TForm2;
 
implementation
 
{$R *.dfm}
 
procedure TForm2.Button1Click(Sender: TObject);
begin
Form1.Visible:=True;
Form2.Visible:=False;
end;
 
procedure TForm2.Button2Click(Sender: TObject);
begin
   Form2.GLSceneViewer1.Camera:=Form2.GLCamera1;
   Form2.Button2.Enabled:=False;
   Form2.Button3.Enabled:=True;
end;
 
procedure TForm2.Button3Click(Sender: TObject);
begin
   Form2.GLSceneViewer1.Camera:=Form2.GLCamera2;
   Form2.Button3.Enabled:=False;
   Form2.Button2.Enabled:=True;
end;
 
procedure TForm2.Button4Click(Sender: TObject);
var
P: array [0..99] of TGLPoints;
i: Integer;
begin
for i:=Low(P) to High(P) do
begin
P[i]:=TGLPoints.Create(Form2.GLSceneViewer1.Camera.TargetObject);
P[i].Colors.Add((Double(Random(256)))/256.0,
                   (Double(Random(256)))/256.0,
                   (Double(Random(256)))/256.0,0.5);
P[i].Size:=5;
P[i].Position.X:=1.0*Random(5000)/5000-0.5;
P[i].Position.Y:=1.0*Random(5000)/5000-0.5;
P[i].Position.Z:=1.0*Random(5000)/5000-0.5;
end;
end;
 
procedure TForm2.FormMouseWheel(Sender: TObject; Shift: TShiftState;
  WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
begin
if(Form2.GLSceneViewer1.MouseInControl=true) then Form2.GLSceneViewer1.Camera.AdjustDistanceToTarget(Power(1.1,-WheelDelta/120))
end;
 
procedure TForm2.GLCadencer1Progress(Sender: TObject; const deltaTime,
  newTime: Double);
begin
//Движение вперед по клавишам ‘ц’ и’ w’
if (IsKeyDown('ц') OR IsKeyDown('w')) then Form2.GLSceneViewer1.Camera.Move(2* deltaTime);
//Движение назад по клавишам ‘ы’ и ‘s’
if (IsKeyDown('ы') OR IsKeyDown('s')) then Form2.GLSceneViewer1.Camera.Move(-2* deltaTime);
//Поворот влево по клавишам ‘ф’ и’ a’
if (IsKeyDown('ф') OR IsKeyDown('a')) then Form2.GLSceneViewer1.Camera.slide(-2* deltaTime);
//Поворот вправо по клавишам ‘в’ и ‘d’
if (IsKeyDown('в') OR IsKeyDown('d')) then Form2.GLSceneViewer1.Camera.slide(2* deltaTime);
//Движение вверх по клавишам ‘u’ и ‘г’
if (IsKeyDown('u') OR IsKeyDown('г')) then Form2.GLSceneViewer1.Camera.Lift(0.01);
//Движение вниз по клавишам ‘n’ и ‘т’
if (IsKeyDown('n') OR IsKeyDown('т')) then Form2.GLSceneViewer1.Camera.Lift(-0.01);
if (IsKeyDown('c') OR IsKeyDown('с')) then GLSceneViewer1.Camera:=GLCamera1;
if (IsKeyDown('v') OR IsKeyDown('м')) then GLSceneViewer1.Camera:=GLCamera2
end;
 
procedure TForm2.GLCube1Progress(Sender: TObject; const deltaTime,
  newTime: Double);
begin
Form2.GLCube1.TurnAngle:=Form2.GLCube1.TurnAngle + deltaTime * 100;
end;
 
procedure TForm2.GLSceneViewer1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  mx:=x; my:=y; //Запомнить координаты мыши
end;
 
procedure TForm2.GLSceneViewer1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if Shift<>[] then begin //Если нажата клавиша
  Form2.GLSceneViewer1.Camera.MoveAroundTarget(my-y, mx-x); //Перемещаем камеру вокруг целевого объекта
  Form2.GLLightSource1.Position:=Form2.GLSceneViewer1.Camera.Position; //Пусть источник освещения будет рядом с камерой
  mx:=x; my:=y;
  end;
end;
 
procedure TForm2.TrackBar1Change(Sender: TObject);
begin
Form2.GLSceneViewer1.Camera.TargetObject.PitchAngle:=TrackBar1.Position;
end;
 
procedure TForm2.TrackBar2Change(Sender: TObject);
begin
Form2.GLSceneViewer1.Camera.TargetObject.RollAngle:=TrackBar2.Position;
end;
 
procedure TForm2.TrackBar3Change(Sender: TObject);
begin
Form2.GLSceneViewer1.Camera.TargetObject.TurnAngle:=TrackBar3.Position;
end;
 
end.
0
Миниатюры
Написание функции для создания точек внутри куба и сферы: перевод кода из C++ в Delphi   Написание функции для создания точек внутри куба и сферы: перевод кода из C++ в Delphi   Написание функции для создания точек внутри куба и сферы: перевод кода из C++ в Delphi  

Написание функции для создания точек внутри куба и сферы: перевод кода из C++ в Delphi  
Вложения
Тип файла: zip lab1-delphi.zip (5.08 Мб, 3 просмотров)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.09.2019, 11:55
Ответы с готовыми решениями:

Рекурсия вместо трёх циклов for для генерирования точек внутри сферы
нужно переделать код. Вместо 3 циклов использовать рекурсию. /* * File: main.c * Author:...

Написание кода для создания таблицы на html
Здравствуйте. Интересует проблема написания html кода для этих двух таблиц с учтенными замечаниями...

Быстрая генерация случайных точек внутри сферы
Доброго времени суток, Господа. Стесняюсь за такие вопросы, но все же:) Делаю систему частиц....

Написание в Delphi программы для создания и прохождения теста
Здравствуйте! Очень нужна ваша помощь. Задали курсовой проект, который нужно выполнить в течении...

22
0 / 0 / 4
Регистрация: 21.08.2017
Сообщений: 184
20.09.2019, 12:00  [ТС] 2
Вот результаты работы программы:
0
Миниатюры
Написание функции для создания точек внутри куба и сферы: перевод кода из C++ в Delphi   Написание функции для создания точек внутри куба и сферы: перевод кода из C++ в Delphi   Написание функции для создания точек внутри куба и сферы: перевод кода из C++ в Delphi  

Написание функции для создания точек внутри куба и сферы: перевод кода из C++ в Delphi   Написание функции для создания точек внутри куба и сферы: перевод кода из C++ в Delphi  
878 / 581 / 178
Регистрация: 28.02.2017
Сообщений: 2,359
Записей в блоге: 1
20.09.2019, 17:35 3
Вот именно за это я и аж не могу терпеть этот CPP...
C++
1
((float)(rand()%256))/256.0
эммм... Результат rand() нацело делится на 256... Потом преобразуется во float, и уже тогда делится на 256.0. хм...
C++
1
1.0*rand()/RAND_MAX-0.5
эммм... Результат rand() умножается на единицу... гм... И нафига же? Просто чтоб так же из целого преобразовалось во float? Дак строчкой выше же использовали явный каст, почему уже другой способ? Что за каша?
...и делится на RAND_MAX, которое константа, бла-бла, для MVS равная 32767, гм...
Функция rand() генерирует числа в диапазоне от 0 до RAND_MAX.
Видимо целые? А в чём истинный смысл всех данных вычислений-то?

Добавлено через 5 минут
C++
1
((float)(rand()%256))/256.0
Предполагая что RAND_MAX равен 32767... Случайное целое число от 0 до 255 делится на 256.
Получаем "случайное вещественное число от 0 до 0.996". Ну или типа почти до 1.
C++
1
1.0*rand()/RAND_MAX-0.5
Итак, rand()/RAND_MAX - это получится вещественное число от нуля до единицы.
А вычитая из этого 0.5 получим "случайное вещественное число от -0.5 до 0.5".

Добавлено через 8 минут
Исходя из этого, приближение первое:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
procedure TForm2.Button4Click(Sender: TObject);
var i: Integer; P: array [0..99] of TGLPoints;
begin
for i := Low(P) to High(P) do
    begin
    P[i] := TGLPoints.Create(GLSceneViewer1.Camera.TargetObject);
    P[i].Colors.Add(
        RandomRange(0, 1000) / 1000,
        RandomRange(0, 1000) / 1000,
        RandomRange(0, 1000) / 1000,
        0.5
    );
    P[i].Size := 5;
    P[i].Position.X := RandomRange(-500, 500) / 1000;
    P[i].Position.Y := RandomRange(-500, 500) / 1000;
    P[i].Position.Z := RandomRange(-500, 500) / 1000;
    end;
end;
Только я как-то не понимаю зачем тут именно массив... Его никуда не передают, нигде не хранят...

Добавлено через 35 минут
А можно попытаться сделать что-то удобнее вроде:
Delphi
1
2
3
4
5
6
7
Function RandomRangeDouble(Const MinF: Double; Const MaxF: Double; Const Precision: Integer = 10000): Double;
Var MinI, MaxI: Integer;
Begin
MinI := Trunc(MinF * Precision);
MaxI := Trunc(MaxF * Precision);
Result := RandomRange(MinI, MaxI) / Precision;
End;
(писал прям тут, не проверял, пока нет возможности)
0
0 / 0 / 4
Регистрация: 21.08.2017
Сообщений: 184
20.09.2019, 18:08  [ТС] 4
С помощью рандома идёт генерация координат, где будут создаваться точки, и их цветов. Поскольку максимальное значение для цветопередачи - 255 (8 единиц), оттуда и эта константа.

Добавлено через 1 минуту
И я не знаю, какая максимально возможная координата может быть внутри куба и сферы.

Добавлено через 3 минуты
С помощью массива определяются координаты точек и их цвет. Точка - это объект класса TGLPoints. Каждая точка имеет свои особенные свойства (положение на координатной "сетке", цвет и т.д.), а в задании их тысяча.
0
878 / 581 / 178
Регистрация: 28.02.2017
Сообщений: 2,359
Записей в блоге: 1
20.09.2019, 18:16 5
Составляющая цветовой плоскости в BMP - целое от 0 до 255.
Составляющая цветовой плоскости в OpenGL - вещественное от 0 до 1.

Добавлено через 3 минуты
В самых базовых азах обычно пишут про "куб отсечения" или как-то так.
И чтоб точка попадала в зону видимости, координаты должны быть вещественным числом от -1 до 1 (не помню включительно или нет).
Но это всё достаточно условно, так как существует масштабирование (растяжение/сжатие).

Добавлено через 2 минуты
Массив говорю зачем? В локальном смысла совсем нету. Или в поля формы вынести, или просто убрать:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
procedure TForm2.Button4Click(Sender: TObject);
var i: Integer; Pt: TGLPoints;
begin
for i := 1 to 1000 do
    begin
    Pt := TGLPoints.Create(GLSceneViewer1.Camera.TargetObject);
    Pt.Colors.Add(
        RandomRange(0, 1000) / 1000,
        RandomRange(0, 1000) / 1000,
        RandomRange(0, 1000) / 1000,
        0.5
    );
    Pt.Size := 5;
    Pt.Position.X := RandomRange(-500, 500) / 1000;
    Pt.Position.Y := RandomRange(-500, 500) / 1000;
    Pt.Position.Z := RandomRange(-500, 500) / 1000;
    end;
end;
0
0 / 0 / 4
Регистрация: 21.08.2017
Сообщений: 184
20.09.2019, 18:16  [ТС] 6
Position.X, Position.Y и Position.Z - это координаты создаваемых точек, Color - цвет, разбитый на 3 ячейки по 8 бит (от 0.0.0 до 255.255.255).
0
878 / 581 / 178
Регистрация: 28.02.2017
Сообщений: 2,359
Записей в блоге: 1
20.09.2019, 18:18 7
Судя по коду
C++
1
P[i]->Colors->Add(((float)(rand()%256))/256.0, ((float)(rand()%256))/256.0, ((float)(rand()%256))/256.0, 0.5);
цвет как раз от 0 до 1.
0
0 / 0 / 4
Регистрация: 21.08.2017
Сообщений: 184
20.09.2019, 18:19  [ТС] 8
А без массива их точно будет тысяча?
0
878 / 581 / 178
Регистрация: 28.02.2017
Сообщений: 2,359
Записей в блоге: 1
20.09.2019, 18:27 9
Delphi
1
for i := 1 to 1000 do
Как бы гарантирует тысячу повторений.
Ну сделайте for i := 1 to 7 do и посчитайте глазами.

Не по теме:

Я не знаю что следует передавать в конструктор Create() класса TGLPoints... Может что-то другое, или как-то иначе вставлять куда-то...

0
0 / 0 / 4
Регистрация: 21.08.2017
Сообщений: 184
20.09.2019, 19:12  [ТС] 10
Я попытался сделать по-вашему, но компилятор выдал ошибки.

Код (строки 78-96):
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
procedure TForm2.Button4Click(Sender: TObject);
var i: Integer; Pt: TGLPoints;
begin
for i := 1 to 1000 do
    begin
    Pt := TGLPoints.Create(GLSceneViewer1.Camera.TargetObject);
    Pt.Colors.Add(
        RandomRange(0, 1000) / 1000,
        RandomRange(0, 1000) / 1000,
        RandomRange(0, 1000) / 1000,
        0.5
    );
    Pt.Size := 5;
    Pt.Position.X := RandomRange(-500, 500) / 1000;
    Pt.Position.Y := RandomRange(-500, 500) / 1000;
    Pt.Position.Z := RandomRange(-500, 500) / 1000;
    end;
end;
end;
Сообщения компилятора:
SQL
1
2
3
4
5
6
7
8
9
[dcc32 Hint] Lab2.pas(84): H2443 Inline FUNCTION 'TVectorList.Add' has NOT been expanded because unit 'GLVectorLists' IS NOT specified IN USES list
[dcc32 Hint] Lab2.pas(91): H2443 Inline FUNCTION 'TGLCustomCoordinates.SetCoordinate' has NOT been expanded because unit 'GLVectorTypes' IS NOT specified IN USES list
[dcc32 Hint] Lab2.pas(92): H2443 Inline FUNCTION 'TGLCustomCoordinates.SetCoordinate' has NOT been expanded because unit 'GLVectorTypes' IS NOT specified IN USES list
[dcc32 Hint] Lab2.pas(93): H2443 Inline FUNCTION 'TGLCustomCoordinates.SetCoordinate' has NOT been expanded because unit 'GLVectorTypes' IS NOT specified IN USES list
[dcc32 Error] Lab2.pas(96): E2029 '.' expected but ';' found
[dcc32 Error] Lab2.pas(96): E2029 '.' expected but ';' found
[dcc32 Fatal Error] Lab1.pas(56): F2063 Could NOT compile used unit 'Lab2.pas'
Failed
Elapsed TIME: 00:00:01.7
Добавлено через 1 минуту
Скорее всего, тут действительно нужно через массив, чтобы элемент запоминал свою точку.

Добавлено через 12 минут
Точек по-прежнему нет, хотя события для кнопки и трекбаров во вкладке Events прописаны.

Добавлено через 27 минут
И это я в прошлый раз "лоханулся" и при копировании случайно прописал второй END, но даже когда я в конструкторе добавил приставку Form2 с точкой, при нажатии кнопки Add ничего не произошло.
0
878 / 581 / 178
Регистрация: 28.02.2017
Сообщений: 2,359
Записей в блоге: 1
20.09.2019, 21:28 11
... Inline FUNCTION ... has NOT been expanded because ...
Это можно пропускать. Встраиваемая функция не была использована как встраиваемая.
Ну или добавить ему в Uses тот модуль который он там хочет.
[dcc32 Error] Lab2.pas(96): ...
Сперва хотел написать что не понял где там у вас строчка под номером 96, а потом разглядел дополнение.
Странная ошибка для лишнего End...

Добавлено через 9 минут
У вас если открыть второе окошко и закрыть его "крестиком" - то программа навечно становится невидимой и висит в процессах.
Надо бы добавить или закрытие программы:
Delphi
1
2
3
4
Procedure TForm2.FormClose(Sender: TObject; Var Action: TCloseAction);
Begin
Application.MainForm.Close();
End;
или возврат к первой форме:
Delphi
1
2
3
4
Procedure TForm2.FormClose(Sender: TObject; Var Action: TCloseAction);
Begin
Form1.Visible:=True;
End;
Добавлено через 1 минуту
И на первой форме, так, на будущее:
Delphi
1
2
3
4
5
Procedure TForm1.Button4Click(Sender: TObject);
Begin
Form2.Visible := True;
Visible := False; //   NOT   Form1.Visible := False;
End;
В событиях TForm1.*** в подавляющем большинстве случаев не нужно писать Form1.***.

Добавлено через 1 минуту
Как я уже упоминал, не работал именно с GLScene. Но потыкал в неё палочкой - вроде зашевелилось:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Procedure TForm2.Button4Click(Sender: TObject);
Var
  i: Integer;
  Pt: TGLPoints;
Begin
For i := 1 To 1000 Do
  Begin
  Pt := TGLPoints.Create(GLSceneViewer1.Camera.TargetObject);
  Pt.Colors.Add(RandomRange(0, 1000) / 1000, RandomRange(0, 1000) / 1000, RandomRange(0, 1000) / 1000, 0.5);
  Pt.Size := 5;
  Pt.Position.X := RandomRange(-500, 500) / 1000;
  Pt.Position.Y := RandomRange(-500, 500) / 1000;
  Pt.Position.Z := RandomRange(-500, 500) / 1000;
  GLSceneViewer1.Camera.TargetObject.AddChild(Pt); // Вот, дописал наугад, теперь вроде работает.
  End;
End;
0
0 / 0 / 4
Регистрация: 21.08.2017
Сообщений: 184
21.09.2019, 04:11  [ТС] 12
Спасибо! Точки появились, но почему-то снаружи, на поверхности, а не внутри объекта.
0
0 / 0 / 4
Регистрация: 21.08.2017
Сообщений: 184
21.09.2019, 04:22  [ТС] 13
Вот результаты:
0
Миниатюры
Написание функции для создания точек внутри куба и сферы: перевод кода из C++ в Delphi   Написание функции для создания точек внутри куба и сферы: перевод кода из C++ в Delphi  
0 / 0 / 4
Регистрация: 21.08.2017
Сообщений: 184
21.09.2019, 05:06  [ТС] 14
Видимо, с координатами всё-таки переборщили. Какой диапазон нужен для свойства Position, и на что делить?
0
878 / 581 / 178
Регистрация: 28.02.2017
Сообщений: 2,359
Записей в блоге: 1
21.09.2019, 10:54 15
Почему, у куба они как раз все внутри. Увеличьте масштаб колёсиком. Просто из-за Pt.Size := 5; некоторые "проглядывают".
Ну можно чуть уменьшить: RandomRange(-490, 490) / 1000;;

А вот сфера... Тут уже надо чтоб длина вектора не превышала радиус сферы, гм... Как бы это поудобнее описать-то...

Добавлено через 12 минут
Хотя... Если не мучаться...
Косинус 45о == Синус 45о == 0.70.
Тута радиус в два раза меньше, так что примерно так:
Delphi
1
RandomRange(-330, 330) / 1000;
0
0 / 0 / 4
Регистрация: 21.08.2017
Сообщений: 184
21.09.2019, 19:24  [ТС] 16
При уменьшении диапазона оказалось, что куб и сфера на самом деле "псевдопрозрачные". Хотя пересечения их осей видны, точки появляются лишь при очень сильном приближении, когда грани объектов "проламываются". Я попробовал сделать прозрачность по способам пользователя Fosgen, описанным здесь,
http://delphimaster.net/view/9-1120384424
но для моей видеокарты AMD Radeon R7 это не сработало. И вдобавок, во втором способе при изменении эмиссии голубого и зелёного цветов компилятор выдал окно с ошибкой. Её текст не запомнил, но скорее всего, либо демоверсия рэд студии ограничена в правах, либо для моей "видюхи" это невозможно. Как выкрутиться, не знаю, ведь способов уйма в зависимости от типа видеокарты и нет универсального решения. Как сделать, чтобы и грани (поверхность) объекта были видны, и точки просвечивались?
0
Миниатюры
Написание функции для создания точек внутри куба и сферы: перевод кода из C++ в Delphi  
0 / 0 / 4
Регистрация: 21.08.2017
Сообщений: 184
21.09.2019, 19:32  [ТС] 17
Но запомнил, что та ошибка была очень назойливой, требовала отправить отчёт и программу закрыть не давала.
0
0 / 0 / 4
Регистрация: 21.08.2017
Сообщений: 184
21.09.2019, 19:38  [ТС] 18
При попытке установить эмиссию вылезло вот это окно:
0
Миниатюры
Написание функции для создания точек внутри куба и сферы: перевод кода из C++ в Delphi  
0 / 0 / 4
Регистрация: 21.08.2017
Сообщений: 184
22.09.2019, 13:42  [ТС] 19
Свойства NoZWrite для куба в инспекторе не было. Для какого объекта его вообще надо прописывать?

Добавлено через 4 часа 32 минуты
Какие драйверы нужны для моей "видюхи" AMD Radeon R7, чтобы мой ноут наконец-то "потянул" эти непокорные свойства эмиссии для текстуры куба?

Добавлено через 1 минуту
...И куб стал прозрачным (точки просвечивались через грани)?
0
0 / 0 / 4
Регистрация: 21.08.2017
Сообщений: 184
23.09.2019, 13:09  [ТС] 20
Препод сказал - вывести куб и выставить Ambient.Alpha во фронтах в 0,5. Я вернул первоначальный BlendingMode, а потом сделал это сначала через инспектор объектов, а потом через событие OnCreate для второй формы, но это не помогло.

Delphi
1
2
3
4
5
procedure TForm2.FormCreate(Sender: TObject);
begin
Form2.GLCube1.Material.FrontProperties.Ambient.Alpha:=0.5;
Form2.GLSphere1.Material.FrontProperties.Ambient.Alpha:=0.5;
end;
Добавлено через 4 минуты
То же самое через первую форму дало ошибку.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.09.2019, 13:09

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Написание в Delphi программы для создания и прохождения теста
Здравствуйте! Очень нужна ваша помощь. Задали курсовой проект, который нужно выполнить в течении...

Написание кода для формулы в Delphi 6
Помогите пожалуйста... Нужно написать код в Дельфи 6 для расчета формулы. Надо создать форму с...

Написание кода игры "Жизнь" для трех точек
Здесь поставлены три точки на местах 5,12 7,14 9,14 dosseg .model tiny .stack 100h .code ...

перевод кода Delphi в формулу для вычисляемого столбца
Вот процедура, в которой вычисляется значение для поля: procedure TDM.BiletCalcFields(DataSet:...

Пересечение сферы и куба
Дано: пересекаются сфера (радиус R, координаты центра x1,y1,z1) и куб (длина ребра L, координаты...

написание кода движения 1го обьекта внутри другого при помоши клавиш
надо сделать програму в JavaScript чтобы заданная мной картинка двигалась в зависимости от нажатых...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.