Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
100 / 35 / 21
Регистрация: 17.09.2014
Сообщений: 1,599
1

Построение геосферы в 3d пространстве

08.08.2017, 21:02. Показов 1951. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Вот такую штуковину нужно нарисовать(из линий).

Построение геосферы в 3d пространстве


Гуглил, гуглил, ничего понятного не нашел.

Кликните здесь для просмотра всего текста
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
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
public static class GeometryProvider
{
 
    private static int GetMidpointIndex(Dictionary<string, int> midpointIndices, List<Vector3> vertices, int i0, int i1)
    {
 
        var edgeKey = string.Format("{0}_{1}", Math.Min(i0, i1), Math.Max(i0, i1));
 
        var midpointIndex = -1;
 
        if (!midpointIndices.TryGetValue(edgeKey, out midpointIndex))
        {
            var v0 = vertices[i0];
            var v1 = vertices[i1];
 
            var midpoint = (v0 + v1) / 2f;
 
            if (vertices.Contains(midpoint))
                midpointIndex = vertices.IndexOf(midpoint);
            else
            {
                midpointIndex = vertices.Count;
                vertices.Add(midpoint);
                midpointIndices.Add(edgeKey, midpointIndex);
            }
        }
 
 
        return midpointIndex;
 
    }
 
    /// <remarks>
    ///      i0
    ///     /  \
    ///    m02-m01
    ///   /  \ /  \
    /// i2---m12---i1
    /// </remarks>
    /// <param name="vectors"></param>
    /// <param name="indices"></param>
    public static void Subdivide(List<Vector3> vectors, List<int> indices, bool removeSourceTriangles)
    {
        var midpointIndices = new Dictionary<string, int>();
 
        var newIndices = new List<int>(indices.Count * 4);
 
        if (!removeSourceTriangles)
            newIndices.AddRange(indices);
 
        for (var i = 0; i < indices.Count - 2; i += 3)
        {
            var i0 = indices[i];
            var i1 = indices[i + 1];
            var i2 = indices[i + 2];
 
            var m01 = GetMidpointIndex(midpointIndices, vectors, i0, i1);
            var m12 = GetMidpointIndex(midpointIndices, vectors, i1, i2);
            var m02 = GetMidpointIndex(midpointIndices, vectors, i2, i0);
 
            newIndices.AddRange(
                new[] {
                    i0,m01,m02
                    ,
                    i1,m12,m01
                    ,
                    i2,m02,m12
                    ,
                    m02,m01,m12
                }
                );
 
        }
 
        indices.Clear();
        indices.AddRange(newIndices);
    }
 
    /// <summary>
    /// create a regular icosahedron (20-sided polyhedron)
    /// </summary>
    /// <param name="primitiveType"></param>
    /// <param name="size"></param>
    /// <param name="vertices"></param>
    /// <param name="indices"></param>
    /// <remarks>
    /// You can create this programmatically instead of using the given vertex 
    /// and index list, but it's kind of a pain and rather pointless beyond a 
    /// learning exercise.
    /// </remarks>
 
    /// note: icosahedron definition may have come from the OpenGL red book. I don't recall where I found it. 
    public static void Icosahedron(List<Vector3> vertices, List<int> indices)
    {
 
        indices.AddRange(
            new int[]
            {
                0,4,1,
                0,9,4,
                9,5,4,
                4,5,8,
                4,8,1,
                8,10,1,
                8,3,10,
                5,3,8,
                5,2,3,
                2,7,3,
                7,10,3,
                7,6,10,
                7,11,6,
                11,0,6,
                0,1,6,
                6,1,10,
                9,0,11,
                9,11,2,
                9,2,5,
                7,2,11 
            }
            .Select(i => i + vertices.Count)
        );
 
        var X = 0.525731112119133606f;
        var Z = 0.850650808352039932f;
 
        vertices.AddRange(
            new[] 
            {
                new Vector3(-X, 0f, Z),
                new Vector3(X, 0f, Z),
                new Vector3(-X, 0f, -Z),
                new Vector3(X, 0f, -Z),
                new Vector3(0f, Z, X),
                new Vector3(0f, Z, -X),
                new Vector3(0f, -Z, X),
                new Vector3(0f, -Z, -X),
                new Vector3(Z, X, 0f),
                new Vector3(-Z, X, 0f),
                new Vector3(Z, -X, 0f),
                new Vector3(-Z, -X, 0f) 
            }
        );
    }
}


Или:
Кликните здесь для просмотра всего текста
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
26
27
28
29
30
31
32
33
34
35
36
37
38
void r3d_surface::createZone(float fStart,float fEnd,int nSegs) {
    int V = nSegs + 1;
    int G = nSegs*2 + 1;
    vertex.resize(V*G);
    texUV.resize(V*G);
    normal.resize(V*G);
    float theta,phi;
    int cnt = 0;
    for (int i=0;i<V;i++) {
        phi = fStart + (fEnd-fStart)*i/(V-1);
        for (int j=0;j<G;j++) {
            theta = 2*PI*j/(G-1);
            vertex[cnt] = r3d_vector(   cos(phi)*cos( theta ),
                                        sin(phi),
                                        cos(phi)*sin( theta ) );
            texUV[cnt] = r3d_vector2d (  theta /2/PI,
                                        1.0f - (phi-fStart)/(fEnd-fStart) );
            if (fStart>fEnd)
                normal[cnt] = -vertex[cnt]; else
                normal[cnt] =  vertex[cnt];
            normal[cnt].normalize();
            cnt++;
        };
    };
    index.resize(6*(V-1)*(G-1));
    #define SET(x,y) ((x)*(G)+(y))
    for (i=0;i<V-1;i++) {
        for (int j=0;j<G-1;j++) {
            index[i*(G-1)*6 + j*6 + 0] = SET(i+0,j+0);
            index[i*(G-1)*6 + j*6 + 2] = SET(i+1,j+1);
            index[i*(G-1)*6 + j*6 + 1] = SET(i+1,j+0);
            index[i*(G-1)*6 + j*6 + 3] = SET(i+0,j+0);
            index[i*(G-1)*6 + j*6 + 5] = SET(i+0,j+1);
            index[i*(G-1)*6 + j*6 + 4] = SET(i+1,j+1);
        };
    };
    #undef SET
};


Есть координата в пространстве - origin[3], и расстояние от неё, т.е. край сферы - dist
Так же есть функция, которая рисует линию по 2м точкам - show_line(int start[3], int end[3])

C++
1
2
3
4
void create_geo_sphere(int origin[3], int dist)
{
 
}
Т.е. сначала нужно получить(ну или получать и сразу отрисовывать) все точки, а потом соединить из них линиями сферу.
Кто может чем помочь?
1
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.08.2017, 21:02
Ответы с готовыми решениями:

Построение прямых в пространстве
Нужно в матлабе построить прямую в пространстве. Например у меня задана прямая в каноническом виде...

Построение плоскости в пространстве
Нужна помощь в построении плоскости в пространстве в Матлабе. Вот у меня есть плоскость:...

Построение точек в трехмерном пространстве
Здравствуйте! Есть координаты точек в XYZ, как вывести это точки в трехмерном пространстве,...

Построение узла в трехмерном пространстве
Помогите пожалуйста построить в трехмерном пространстве узел.

6
278 / 186 / 75
Регистрация: 12.04.2017
Сообщений: 1,088
Записей в блоге: 2
08.08.2017, 21:11 2
а где нарисовать, на чём?
1
100 / 35 / 21
Регистрация: 17.09.2014
Сообщений: 1,599
08.08.2017, 21:17  [ТС] 3
В пространстве
Ну есть окно программы, в нём пространство, можно приблизить, отдалить, покрутить.
Туповато конечно, объяснение...

Я просто не пойму из примеров с инета, где начальная функция и где точки, и где линии, там везде какими-то встроенными функциями всё сделано...
0
278 / 186 / 75
Регистрация: 12.04.2017
Сообщений: 1,088
Записей в блоге: 2
08.08.2017, 21:18 4
артист, понял уже ) .
на чем не важно.
1
100 / 35 / 21
Регистрация: 17.09.2014
Сообщений: 1,599
09.08.2017, 09:04  [ТС] 5
Кажись понял...
Тут всего-то 6 6тигранников + точка в середине...
Углы по 45 и 30, умножение на радиус...
0
Заблокирован
09.08.2017, 09:18 6
Лучший ответ Сообщение было отмечено артист как решение

Решение

вроде 20 правильных треугольников, по 5 на полюсах и 10 на экваторе, потом они дробятся и т.д.
а на рисунке вроде футбольный мяч раздробленный
1
1494 / 1209 / 821
Регистрация: 29.02.2016
Сообщений: 3,614
09.08.2017, 09:51 7
https://stackoverflow.com/ques... -map-tiles
1
09.08.2017, 09:51
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.08.2017, 09:51
Помогаю со студенческими работами здесь

Построение нескольки функций в пространстве
Приветствую. Помогите пожалуйста построить в пространстве следующие функции, указав все точки...

Построение поверхностей в трехмерном пространстве
Помогите сделать лабораторную, пожалуйста... 1.Построить верхнюю часть эллипсоида, заданного...

Построение поверхностей в трехмерном пространстве
Построить верхнюю (четные варианты) или нижнюю (нечетные варианты) часть эллипсоида, заданного...

Развертка геосферы
Посоветуйте где можно найти формулы Есть прямоугольная карта мира и геосфера из равных...


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

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