Что такое координаты сферы?

Я пытаюсь получить координаты для построения сферы, используя формулу, представленную <a href="https://ru.onlinemschool.com/math/formula/sphere/" rel="nofollow">здесь</a>. Однако при рисовании точками у меня получается лишь маленькая красная точка в центре. Не уверен, вызывает ли проблему сама формула или код. Мой код представлен ниже: <pre><code class="cpp">GLfloat *buf = new GLfloat[197820*9];
GLfloat x, y, z,r=0.5;
int count = 0;
GLfloat arr1[9];
int n;
for (GLfloat i = 0; i &lt;= 3.14; i += 0.01)
	for (GLfloat j = 0; j &lt;= 2.0 * 3.14; j += 0.01)
	{
		x = r * (GLfloat)sin(i) * (GLfloat)cos(j);
		y = r * (GLfloat)sin(i) * (GLfloat)sin(j);
		z = r * (GLfloat)cos(i);
		arr1[0] = x;
		arr1[1] = y;
		arr1[2] = z;
		arr1[3] = 1.0;//R
		arr1[4] = 0.0;//G
		arr1[5] = 0.0;//B
		arr1[6] = 1.0;//A
		arr1[7] = 0.0;//S
		arr1[8] = 0.0;//T
		count++;
		n = sizeof(arr1) / sizeof(arr1[0]);
		std::copy(arr1, arr1 + n, buf);
	}
std::cout &lt;&lt; "n"&lt;&lt;n&lt;&lt;"count" &lt;&lt; count&lt;&lt;"buf"&lt;&lt; sizeof(GLfloat) * 197820 *9;
...
	f-&gt;glDrawArrays(GL_POINTS, 0, 197820);</code></pre>
  • 31 октября 2024 г. 23:33
Ответы на вопрос 2
Ваша проблема с отображением сферы, скорее всего, связана с тем, как вы заполняете массив координат `buf` и с тем, как вы используете переменную `count`. Давайте рассмотрим ваш код и исправим его.

Сначала разберем вашу формулу для координат сферы. Вы используете сферические координаты, где:

- `x = r * sin(φ) * cos(θ)`
- `y = r * sin(φ) * sin(θ)`
- `z = r * cos(φ)`

где `φ` (phi) — это полярный угол (от 0 до π), а `θ` (theta) — это азимутальный угол (от 0 до 2π).

### Исправление кода

1. Вам нужно корректно заполнять массив `buf`. В текущем коде вы каждый раз перезаписываете его с данными `arr1`, в результате у вас получаются только последние координаты. Вместо этого вам нужно поочередно заполнять его.

2. Переменная `count` должна быть использована для индексации массива `buf`, а не для этапа подсчета.

3. Можно упростить использование `std::copy` и не выделять отдельный массив `arr1`.

Вот исправленный код:

```cpp
GLfloat *buf = new GLfloat[197820 * 9];
GLfloat x, y, z, r = 0.5;
int count = 0;

for (GLfloat i = 0; i <= 3.14; i += 0.01) {
    for (GLfloat j = 0; j <= 2.0 * 3.14; j += 0.01) {
        x = r * (GLfloat)sin(i) * (GLfloat)cos(j);
        y = r * (GLfloat)sin(i) * (GLfloat)sin(j);
        z = r * (GLfloat)cos(i);

        // Здесь мы заполняем buf
        buf[count * 9]     = x;  // X
        buf[count * 9 + 1] = y;  // Y
        buf[count * 9 + 2] = z;  // Z
        buf[count * 9 + 3] = 1.0; // R
        buf[count * 9 + 4] = 0.0; // G
        buf[count * 9 + 5] = 0.0; // B
        buf[count * 9 + 6] = 1.0; // A
        buf[count * 9 + 7] = 0.0; // S
        buf[count * 9 + 8] = 0.0; // T
        count++;
    }
}

std::cout << "count: " << count << std::endl;

f->glDrawArrays(GL_POINTS, 0, count);
```

### Важные моменты:
1. Мы используем `count` для правильного индексации массива `buf`.
2. Мы увеличиваем диапазон `i` с небольшим шагом для получения более плотного представления сферы.
3. Убедитесь, что у вас достаточно места в массиве `buf` и что он был правильно инициализирован для заданного количества точек. В вашем коде вы выделяете память для 197820 точек, но не забудьте проверить, что `count` не превышает это значение.
4. Возможно, в вашей системе также необходимо переключить режим глубины, чтобы правильно отображались все точки.

Теперь, запустив этот исправленный код, вы должны увидеть, что рисуется не просто точка, а сфера.
std::copy(arr1, arr1 + n, buf);

Все рассчитанные в циклах значения копируются в первые 9 элементов массива buf, остальные элементы этого массива остаются неинициализированными.
Можно поправить код следующим образом, чтобы заполнить весь массив:
int off = 0;
...
for (GLfloat i = 0; i <= 3.14; i += 0.01)
    for (GLfloat j = 0; j <= 2.0 * 3.14; j += 0.01)
    {
        ...
        std::copy(arr1, arr1 + n, buf + off);
        off += n;
    }
Похожие вопросы