Algoritmo sbagliato?

di il
4 risposte

Algoritmo sbagliato?

Buongiorno,
Spero di aver scelto la sezione giusta, in quanto il mio problema non è l'utilizzo della libreria, ma l'algoritmo che sto scrivendo.
sto cercando di realizzare un grafico 3D utilizzando la libreria helix toolkit, che è una libreria grafica, con la quale disegno il grafico definendo i triangoli che compongono l'intera mesh.
La sorgente dei dati che voglio rappresentare è un array monodimensionale, che contiene però i valori Z, come se il grafico fosse tagliato a fette; ho quindi scritto quanto segue

 Public Shared MySourceArray As Byte()
    Dim punti = 16
    Dim curve = 8
    Dim valori As New List(Of Integer)
    Dim indices1 As New List(Of Integer)
    Dim indices2 As New List(Of Integer)
    Dim triangoli = (punti - 1) * (curve - 1) * 2
    Private myGeometryModel As Object

in clicked button event:

 myMeshGeometry3D.Positions.Clear()
        myMeshGeometry3D.TriangleIndices.Clear()
        'Traslate Greed to Origin
        mygridX.Transform = New TranslateTransform3D(5, 5, 0)
        mygridY.Transform = New TranslateTransform3D(0, 5, 5)
        mygridZ.Transform = New TranslateTransform3D(5, 0, 5)

        'Add value for Test array
        For i = &H6A156 To (((curve * punti) * 2) + &H6A156) - 1 Step 2
            valori.Add(SwitchSignedEndian16(MySourceArray, i))

        Next
Poi carico le Positions (dividendo per 1000 per farci stare il grafico nello schermo)
 For I = 0 To curve - 1
            'per ogni curva
            For b = 0 To punti - 1
                myMeshGeometry3D.Positions.Add(New Point3D(b, I, valori(I * punti + b) / 1000))

            Next


        Next
Poi Calcolo TriancleIndices.
```
myMeshGeometry3D.TriangleIndices.Clear()
Dim myTriangleIndicesCollection As Int32Collection = New Int32Collection()

    For d = punti + 1 To triangoli - 2 Step punti
        For f = 0 To punti - 2 Step 1

            myTriangleIndicesCollection.Add(d + f)
            myTriangleIndicesCollection.Add((d - 1) + f)
            myTriangleIndicesCollection.Add((d - punti) + f)
        Next
    Next


    MsgBox(myTriangleIndicesCollection.ToString)
    For j = 0 To triangoli Step punti
        For i = 0 To punti - 2 Step 1
            myTriangleIndicesCollection.Add(j + i)
            myTriangleIndicesCollection.Add((j + 1) + i)
            myTriangleIndicesCollection.Add((j + punti) + i)
        Next
    Next
    MsgBox(myTriangleIndicesCollection.ToString)

    myMeshGeometry3D.TriangleIndices = myTriangleIndicesCollection

Ho inserito 2 messagebox per verificare quanto calcolato
HelixTest TriangleIndicesCollection 1 cycle

17 16 1 18 17 2 19 18 3 20 19 4 21 20 5 22 21 6 23 22 7 24 23 8 25 24 9 26 25 10 27 26 11 28 27 12 29 28 13 30 29 14 31 30 15 33 32 17 34 33 18 35 34 19 36 35 20 37 36 21 38 37 22 39 38 23 40 39 24 41 40 25 42 41 26 43 42 27 44 43 28 45 44 29 46 45 30 47 46 31 49 48 33 50 49 34 51 50 35 52 51 36 53 52 37 54 53 38 55 54 39 56 55 40 57 56 41 58 57 42 59 58 43 60 59 44 61 60 45 62 61 46 63 62 47 65 64 49 66 65 50 67 66 51 68 67 52 69 68 53 70 69 54 71 70 55 72 71 56 73 72 57 74 73 58 75 74 59 76 75 60 77 76 61 78 77 62 79 78 63 81 80 65 82 81 66 83 82 67 84 83 68 85 84 69 86 85 70 87 86 71 88 87 72 89 88 73 90 89 74 91 90 75 92 91 76 93 92 77 94 93 78 95 94 79 97 96 81 98 97 82 99 98 83 100 99 84 101 100 85 102 101 86 103 102 87 104 103 88 105 104 89 106 105 90 107 106 91 108 107 92 109 108 93 110 109 94 111 110 95 113 112 97 114 113 98 115 114 99 116 115 100 117 116 101 118 117 102 119 118 103 120 119 104 121 120 105 122 121 106 123 122 107 124 123 108 125 124 109 126 125 110 127 126 111 129 128 113 130 129 114 131 130 115 132 131 116 133 132 117 134 133 118 135 134 119 136 135 120 137 136 121 138 137 122 139 138 123 140 139 124 141 140 125 142 141 126 143 142 127 145 144 129 146 145 130 147 146 131 148 147 132 149 148 133 150 149 134 151 150 135 152 151 136 153 152 137 154 153 138 155 154 139 156 155 140 157 156 141 158 157 142 159 158 143 161 160 145 162 161 146 163 162 147 164 163 148 165 164 149 166 165 150 167 166 151 168 167 152 169 168 153 170 169 154 171 170 155 172 171 156 173 172 157 174 173 158 175 174 159 177 176 161 178 177 162 179 178 163 180 179 164 181 180 165 182 181 166 183 182 167 184 183 168 185 184 169 186 185 170 187 186 171 188 187 172 189 188 173 190 189 174 191 190 175 193 192 177 194 193 178 195 194 179 196 195 180 197 196 181 198 197 182 199 198 183 200 199 184 201 200 185 202 201 186 203 202 187 204 203 188 205 204 189 206 205 190 207 206 191
HelixTest TriagleIndicesCollection 2 cycle

17 16 1 18 17 2 19 18 3 20 19 4 21 20 5 22 21 6 23 22 7 24 23 8 25 24 9 26 25 10 27 26 11 28 27 12 29 28 13 30 29 14 31 30 15 33 32 17 34 33 18 35 34 19 36 35 20 37 36 21 38 37 22 39 38 23 40 39 24 41 40 25 42 41 26 43 42 27 44 43 28 45 44 29 46 45 30 47 46 31 49 48 33 50 49 34 51 50 35 52 51 36 53 52 37 54 53 38 55 54 39 56 55 40 57 56 41 58 57 42 59 58 43 60 59 44 61 60 45 62 61 46 63 62 47 65 64 49 66 65 50 67 66 51 68 67 52 69 68 53 70 69 54 71 70 55 72 71 56 73 72 57 74 73 58 75 74 59 76 75 60 77 76 61 78 77 62 79 78 63 81 80 65 82 81 66 83 82 67 84 83 68 85 84 69 86 85 70 87 86 71 88 87 72 89 88 73 90 89 74 91 90 75 92 91 76 93 92 77 94 93 78 95 94 79 97 96 81 98 97 82 99 98 83 100 99 84 101 100 85 102 101 86 103 102 87 104 103 88 105 104 89 106 105 90 107 106 91 108 107 92 109 108 93 110 109 94 111 110 95 113 112 97 114 113 98 115 114 99 116 115 100 117 116 101 118 117 102 119 118 103 120 119 104 121 120 105 122 121 106 123 122 107 124 123 108 125 124 109 126 125 110 127 126 111 129 128 113 130 129 114 131 130 115 132 131 116 133 132 117 134 133 118 135 134 119 136 135 120 137 136 121 138 137 122 139 138 123 140 139 124 141 140 125 142 141 126 143 142 127 145 144 129 146 145 130 147 146 131 148 147 132 149 148 133 150 149 134 151 150 135 152 151 136 153 152 137 154 153 138 155 154 139 156 155 140 157 156 141 158 157 142 159 158 143 161 160 145 162 161 146 163 162 147 164 163 148 165 164 149 166 165 150 167 166 151 168 167 152 169 168 153 170 169 154 171 170 155 172 171 156 173 172 157 174 173 158 175 174 159 177 176 161 178 177 162 179 178 163 180 179 164 181 180 165 182 181 166 183 182 167 184 183 168 185 184 169 186 185 170 187 186 171 188 187 172 189 188 173 190 189 174 191 190 175 193 192 177 194 193 178 195 194 179 196 195 180 197 196 181 198 197 182 199 198 183 200 199 184 201 200 185 202 201 186 203 202 187 204 203 188 205 204 189 206 205 190 207 206 191 0 1 16 1 2 17 2 3 18 3 4 19 4 5 20 5 6 21 6 7 22 7 8 23 8 9 24 9 10 25 10 11 26 11 12 27 12 13 28 13 14 29 14 15 30 16 17 32 17 18 33 18 19 34 19 20 35 20 21 36 21 22 37 22 23 38 23 24 39 24 25 40 25 26 41 26 27 42 27 28 43 28 29 44 29 30 45 30 31 46 32 33 48 33 34 49 34 35 50 35 36 51 36 37 52 37 38 53 38 39 54 39 40 55 40 41 56 41 42 57 42 43 58 43 44 59 44 45 60 45 46 61 46 47 62 48 49 64 49 50 65 50 51 66 51 52 67 52 53 68 53 54 69 54 55 70 55 56 71 56 57 72 57 58 73 58 59 74 59 60 75 60 61 76 61 62 77 62 63 78 64 65 80 65 66 81 66 67 82 67 68 83 68 69 84 69 70 85 70 71 86 71 72 87 72 73 88 73 74 89 74 75 90 75 76 91 76 77 92 77 78 93 78 79 94 80 81 96 81 82 97 82 83 98 83 84 99 84 85 100 85 86 101 86 87 102 87 88 103 88 89 104 89 90 105 90 91 106 91 92 107 92 93 108 93 94 109 94 95 110 96 97 112 97 98 113 98 99 114 99 100 115 100 101 116 101 102 117 102 103 118 103 104 119 104 105 120 105 106 121 106 107 122 107 108 123 108 109 124 109 110 125 110 111 126 112 113 128 113 114 129 114 115 130 115 116 131 116 117 132 117 118 133 118 119 134 119 120 135 120 121 136 121 122 137 122 123 138 123 124 139 124 125 140 125 126 141 126 127 142 128 129 144 129 130 145 130 131 146 131 132 147 132 133 148 133 134 149 134 135 150 135 136 151 136 137 152 137 138 153 138 139 154 139 140 155 140 141 156 141 142 157 142 143 158 144 145 160 145 146 161 146 147 162 147 148 163 148 149 164 149 150 165 150 151 166 151 152 167 152 153 168 153 154 169 154 155 170 155 156 171 156 157 172 157 158 173 158 159 174 160 161 176 161 162 177 162 163 178 163 164 179 164 165 180 165 166 181 166 167 182 167 168 183 168 169 184 169 170 185 170 171 186 171 172 187 172 173 188 173 174 189 174 175 190 176 177 192 177 178 193 178 179 194 179 180 195 180 181 196 181 182 197 182 183 198 183 184 199 184 185 200 185 186 201 186 187 202 187 188 203 188 189 204 189 190 205 190 191 206 192 193 208 193 194 209 194 195 210 195 196 211 196 197 212 197 198 213 198 199 214 199 200 215 200 201 216 201 202 217 202 203 218 203 204 219 204 205 220 205 206 221 206 207 222 208 209 224 209 210 225 210 211 226 211 212 227 212 213 228 213 214 229 214 215 230 215 216 231 216 217 232 217 218 233 218 219 234 219 220 235 220 221 236 221 222 237 222 223 238

riporto anche lo xaml anche se non è strettamente necessario
<Window x:Name="MainWindowX" x:Class="MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:HelixTest"
        xmlns:HelixToolkit="clr-namespace:HelixToolkit.Wpf;assembly=HelixToolkit.Wpf"
       
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <HelixToolkit:HelixViewport3D Name="myviewport" ZoomExtentsWhenLoaded="True"  Background="Black"  ShowCoordinateSystem="True" >
            <!-- Remember to add light to the scene -->
            <HelixToolkit:SunLight/>
            <ModelVisual3D>
                <ModelVisual3D.Content>
                    <GeometryModel3D x:Name="myGeometryModel3D">
                        
                        <GeometryModel3D.Geometry>
                            <MeshGeometry3D x:Name="myMeshGeometry3D"
                   
                                            TextureCoordinates="0.5 0.8 2 3 ">



                            </MeshGeometry3D>
                        </GeometryModel3D.Geometry >
                        <GeometryModel3D.Material>
                            <MaterialGroup>
                                <DiffuseMaterial>
                                    <DiffuseMaterial.Brush>
                                        
                                            <LinearGradientBrush StartPoint="0,0.5" EndPoint="2,2">
                                                <LinearGradientBrush.GradientStops>
                                                    <GradientStop Color="green" Offset="0.1" />
                                                    <GradientStop Color="yellow" Offset="0.5" />
                                                    <GradientStop Color="red" Offset="1" />
                                                    <GradientStop Color="Blue" Offset="2" />
                                                </LinearGradientBrush.GradientStops>
                                        </LinearGradientBrush>
                                    </DiffuseMaterial.Brush>
                                </DiffuseMaterial>
                            </MaterialGroup>
                        </GeometryModel3D.Material>
                    </GeometryModel3D>
                </ModelVisual3D.Content>
            </ModelVisual3D>



            <HelixToolkit:GridLinesVisual3D x:Name="mygridX"  Width="24" Length="16" MinorDistance="1" MajorDistance="1" Thickness="0.01" Fill="#FF03F921"  LengthDirection="1,0,0" Normal="0,0,1"/>
            <HelixToolkit:GridLinesVisual3D x:Name="mygridY"  Width="24" Length="24" MinorDistance="1" MajorDistance="1" Thickness="0.01" Fill="#FF03F921" LengthDirection="0,0,10" Normal="10,0,0"/>
            <HelixToolkit:GridLinesVisual3D x:Name="mygridZ"  Width="20" Length="20" MinorDistance="1" MajorDistance="1" Thickness="0.01" Fill="#FF03F921" LengthDirection="1,0,0" Normal="0,1,0" />

            <HelixToolkit:BillboardTextVisual3D Position="11 0 0" Text="X" Foreground="Yellow"/>
            <HelixToolkit:BillboardTextVisual3D Position="0 11 0" Text="Y" Foreground="Yellow" />
            <HelixToolkit:BillboardTextVisual3D Position="0 0 11" Text="Z"  Foreground="Yellow"/>
        </HelixToolkit:HelixViewport3D>
        <Button Content="Button" HorizontalAlignment="Left" Height="33" Margin="467,345,0,0" VerticalAlignment="Top" Width="143" Click="Button_Click_1"/>

    </Grid>
</Window>
Il risultato è questo

Come visibile dall'immagine si vedono solo metà dei triangoli;
Quello che non capisco è che se invece di usare dati reali di un grafico 16x8, inserisco i valori di un piano inclinato 3x4 per esempio, riesce benissimo.
Essndo i TriancleIndices il nocciolo di tutto sono convinto che il problema sia in come ho fatto i calcoli negli ultimi 2 cicli for.
Qualche consiglio?

4 Risposte

  • Re: Algoritmo sbagliato?

    Prova a commentare uno dei 2 cicli che crea gli indici e vedi quale dei 2 disegna i triangoli giusti, sembra che molti triangoli siano ripetuti sulla seconda serie.

    Per i due cicli è più sempliuce se ti calcoli prima i 4 vertici per i due triangoli in un unoco ciclo:
    
    a = j + i
    b = j + 1 + i
    c = j + punti + i
    d = j + 1 + punti + i
    
    e poi fai i due triangoli (a,b,c) (b,c,d)

    o ancora meglio, definisci una funzione per ottenere l'indice alla coordinata x,z, eg:
    
     index(x,y, size) -> x * size + y;
    
    cosi puoi fare:
    
    for x 0 to xSize-1
      for y 0 to ySize-1
        a = index (x+0, y+0, punti)
        b = index (x+1, y+0, punti)
        c = index (x+0, y+1, punti)
        d = index (x+1, y+1, punti)
        addTriangle(a,b,c)
        addTriangle(b,c,d)
    
    che rende il codice molto più facile da leggere.
  • Re: Algoritmo sbagliato?

    Commentando il primo ciclo ottengo i triangoli più a sinistra, https://ibb.co/XFx66t
    commentando il secondo quelli più a destra;
    https://ibb.co/9cq7mF
    A questo punto mi sorge il dubbio se il problema sia effettivamente come calcolo gli indici, o se mi sia sfuggito qualcosa sull'utilizzo della libreria, dato che se metto insieme le 2 schermate la mesh sarebbe completa e corretta..
  • Re: Algoritmo sbagliato?

    Potrebbe essere back face culling? Se giri la telecamera dietro la mesh vedi i triangoli opposti?
  • Re: Algoritmo sbagliato?

    fededevi ha scritto:


    Potrebbe essere back face culling? Se giri la telecamera dietro la mesh vedi i triangoli opposti?
    No, ho verificato.
Devi accedere o registrarti per scrivere nel forum
4 risposte