Форум программистов, компьютерный форум, киберфорум
Delphi: Графика, звук, видео
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.73/15: Рейтинг темы: голосов - 15, средняя оценка - 4.73
0 / 0 / 4
Регистрация: 21.08.2017
Сообщений: 208

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

20.09.2019, 11:55. Показов 3279. Ответов 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.
Миниатюры
Написание функции для создания точек внутри куба и сферы: перевод кода из C++ в Delphi   Написание функции для создания точек внутри куба и сферы: перевод кода из C++ в Delphi   Написание функции для создания точек внутри куба и сферы: перевод кода из C++ в Delphi  

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

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

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

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

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

Написание функции для создания точек внутри куба и сферы: перевод кода из C++ в Delphi   Написание функции для создания точек внутри куба и сферы: перевод кода из C++ в Delphi  
0
 Аватар для GoodWeather
886 / 588 / 179
Регистрация: 28.02.2017
Сообщений: 2,359
Записей в блоге: 1
20.09.2019, 17:35
Вот именно за это я и аж не могу терпеть этот 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
Сообщений: 208
20.09.2019, 18:08  [ТС]
С помощью рандома идёт генерация координат, где будут создаваться точки, и их цветов. Поскольку максимальное значение для цветопередачи - 255 (8 единиц), оттуда и эта константа.

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

Добавлено через 3 минуты
С помощью массива определяются координаты точек и их цвет. Точка - это объект класса TGLPoints. Каждая точка имеет свои особенные свойства (положение на координатной "сетке", цвет и т.д.), а в задании их тысяча.
0
 Аватар для GoodWeather
886 / 588 / 179
Регистрация: 28.02.2017
Сообщений: 2,359
Записей в блоге: 1
20.09.2019, 18:16
Составляющая цветовой плоскости в 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
Сообщений: 208
20.09.2019, 18:16  [ТС]
Position.X, Position.Y и Position.Z - это координаты создаваемых точек, Color - цвет, разбитый на 3 ячейки по 8 бит (от 0.0.0 до 255.255.255).
0
 Аватар для GoodWeather
886 / 588 / 179
Регистрация: 28.02.2017
Сообщений: 2,359
Записей в блоге: 1
20.09.2019, 18:18
Судя по коду
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
Сообщений: 208
20.09.2019, 18:19  [ТС]
А без массива их точно будет тысяча?
0
 Аватар для GoodWeather
886 / 588 / 179
Регистрация: 28.02.2017
Сообщений: 2,359
Записей в блоге: 1
20.09.2019, 18:27
Delphi
1
for i := 1 to 1000 do
Как бы гарантирует тысячу повторений.
Ну сделайте for i := 1 to 7 do и посчитайте глазами.

Не по теме:

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

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

Код (строки 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
 Аватар для GoodWeather
886 / 588 / 179
Регистрация: 28.02.2017
Сообщений: 2,359
Записей в блоге: 1
20.09.2019, 21:28
... 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
Сообщений: 208
21.09.2019, 04:11  [ТС]
Спасибо! Точки появились, но почему-то снаружи, на поверхности, а не внутри объекта.
0
0 / 0 / 4
Регистрация: 21.08.2017
Сообщений: 208
21.09.2019, 04:22  [ТС]
Вот результаты:
Миниатюры
Написание функции для создания точек внутри куба и сферы: перевод кода из C++ в Delphi   Написание функции для создания точек внутри куба и сферы: перевод кода из C++ в Delphi  
0
0 / 0 / 4
Регистрация: 21.08.2017
Сообщений: 208
21.09.2019, 05:06  [ТС]
Видимо, с координатами всё-таки переборщили. Какой диапазон нужен для свойства Position, и на что делить?
0
 Аватар для GoodWeather
886 / 588 / 179
Регистрация: 28.02.2017
Сообщений: 2,359
Записей в блоге: 1
21.09.2019, 10:54
Почему, у куба они как раз все внутри. Увеличьте масштаб колёсиком. Просто из-за 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
Сообщений: 208
21.09.2019, 19:24  [ТС]
При уменьшении диапазона оказалось, что куб и сфера на самом деле "псевдопрозрачные". Хотя пересечения их осей видны, точки появляются лишь при очень сильном приближении, когда грани объектов "проламываются". Я попробовал сделать прозрачность по способам пользователя Fosgen, описанным здесь,
http://delphimaster.net/view/9-1120384424
но для моей видеокарты AMD Radeon R7 это не сработало. И вдобавок, во втором способе при изменении эмиссии голубого и зелёного цветов компилятор выдал окно с ошибкой. Её текст не запомнил, но скорее всего, либо демоверсия рэд студии ограничена в правах, либо для моей "видюхи" это невозможно. Как выкрутиться, не знаю, ведь способов уйма в зависимости от типа видеокарты и нет универсального решения. Как сделать, чтобы и грани (поверхность) объекта были видны, и точки просвечивались?
Миниатюры
Написание функции для создания точек внутри куба и сферы: перевод кода из C++ в Delphi  
0
0 / 0 / 4
Регистрация: 21.08.2017
Сообщений: 208
21.09.2019, 19:32  [ТС]
Но запомнил, что та ошибка была очень назойливой, требовала отправить отчёт и программу закрыть не давала.
0
0 / 0 / 4
Регистрация: 21.08.2017
Сообщений: 208
21.09.2019, 19:38  [ТС]
При попытке установить эмиссию вылезло вот это окно:
Миниатюры
Написание функции для создания точек внутри куба и сферы: перевод кода из C++ в Delphi  
0
0 / 0 / 4
Регистрация: 21.08.2017
Сообщений: 208
22.09.2019, 13:42  [ТС]
Свойства NoZWrite для куба в инспекторе не было. Для какого объекта его вообще надо прописывать?

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

Добавлено через 1 минуту
...И куб стал прозрачным (точки просвечивались через грани)?
0
0 / 0 / 4
Регистрация: 21.08.2017
Сообщений: 208
23.09.2019, 13:09  [ТС]
Препод сказал - вывести куб и выставить 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
23.09.2019, 13:09
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru