forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   3D-программирование (http://forum.boolean.name/forumdisplay.php?f=12)
-   -   [?] проверка перечения точки и модели в цикле ... (http://forum.boolean.name/showthread.php?t=13435)

polopok 01.10.2010 15:44

[?] проверка перечения точки и модели в цикле ...
 
идея такая .
1) есть модель и некая точка в пространстве которая свободно перемещается
2) определяем треугольники, вершины и координаты вершин
3) сравниваем попадает точка в треугольники модели или нет
4) выводим результат
вот пример ,но постоянно выводит что точка попала в треугольник.
что не так я сделал ?

Код:

Graphics3D 640,480,16
SetBuffer BackBuffer()
Global x#,y#,z#,  x0#,y0#,z0#,  x1#,y1#,z1#,  x2#,y2#,z2# ,s#,s1#,s2#,s3#,dlt#,in
Global xx1#,yy1#,zz1#,xx2#,yy2#,zz2#,xx0#,yy0#,zz0#
Global Camera = CreateCamera()
Global light=CreateLight()
 
   
    AmbientLight 255, 255, 255
Global Mesh = CreateSphere( 20)
PositionEntity Mesh, 0, 0, 2
EntityAlpha mesh,0.3
    sp= CreateSphere()
    ScaleEntity sp, 0.1, 0.1, 0.1
    EntityColor sp, 255, 0, 0
 
While Not KeyDown(1)
   
   
    If KeyDown( 203 )=True Then x# = x# -.01*0.5 ;  V    strelka vniz
    If KeyDown( 205 )=True Then x# = x# +.01*0.5 ;    ^    strelka vverh
    If KeyDown( 208 )=True Then y# = y# -.01*0.5 ;    <    strelka vlevo
    If KeyDown( 200 )=True Then y# = y# +.01*0.5 ;      >    strelka vpravo
    If KeyDown( 30  )=True Then z# = z# +.01*0.5 ;  A
    If KeyDown( 44  )=True Then z# = z# -.01*0.5  ; Z
   
    PositionEntity sp, x#, y#, z#+2
   
   
    in= in_triangle(in)
   
    UpdateWorld
    RenderWorld
   
    Text 0,0,"      " +in
    Flip
Wend
End
 
 
 
 
 
Function in_triangle(in)
 
    Local SC = CountSurfaces( Mesh)
    Local Vert1=0, C1X#, C1Y#, C1Z#
    Local Vert2=0, C2X#, C2Y#, C2Z#
    Local Vert3=0, C3X#, C3Y#, C3Z#
 
    For CS = 1 To SC
        GS = GetSurface( Mesh, CS )
        For CT =0 To CountTriangles( GS )-1
            Vert1 = TriangleVertex( GS, CT, 0 )
            Vert2 = TriangleVertex( GS, CT, 1 )
            Vert3 = TriangleVertex( GS, CT, 2 )
 
            x0#= VertexX#( GS, Vert1 )
            y0#= VertexY#( GS, Vert1 )
            z0#= VertexZ#( GS, Vert1 )
           
            x1#= VertexX#( GS, Vert2 )
            y1#= VertexY#( GS, Vert2 )
            z1#= VertexZ#( GS, Vert2 )
           
            x2#= VertexX#( GS, Vert3 )
            y2#= VertexY#( GS, Vert3 )
            z2#= VertexZ#( GS, Vert3 )   
 
 s#= (Sqr(((yt1#-yt0#)* (zt2#-zt0#)-(zt1#-zt0#)* (yt2#-yt0#))^2+((zt1#-zt0#)* (xt2#-xt0#)-(xt1#-xt0#)* (zt2#-zt0#))^2+((xt1#-xt0#)* (yt2#-yt0#)-(yt1#-yt0#)* (xt2#-xt0#))^2))/2
 
s1#= (Sqr(((yt1#-yt0#)* (zt#-zt0#)-(z1t#-zt0#)* (yt#-yt0#))^2+((zt1#-zt0#)* (xt#-xt0#)-(xt1#-xt0#)* (zt#-zt0#))^2+((xt1#-xt0#)* (yt#-yt0#)-(yt1#-yt0#)* (xt#-xt0#))^2))/2
 
s2#= (Sqr(((yt#-yt0#)* (zt2#-zt0#)-(zt#-zt0#)* (yt2#-yt0#))^2+((zt#-zt0#)* (xt2#-xt0#)-(xt1#-xt0#)* (zt2#-zt0#))^2+((xt#-xt0#)* (yt2#-yt0#)-(yt#-yt0#)* (xt2#-xt0#))^2))/2
 
s3#= (Sqr(((yt1#-yt#)* (zt2#-zt#)-(zt1#-zt#)* (yt2#-yt#))^2+((z1t#-zt#)* (xt2#-xt#)-(xt1#-xt#)* (zt2#-zt#))^2+((xt1#-xt#)* (yt2#-yt#)-(yt1#-yt#)* (x2#-x#))^2))/2
 
  dlt#=s#*0.0001
 
If Abs(s# -(s1# +s2# +s3)) <dlt# Then Return in= 1  Else Return in= 0
    Next
    Next
End Function


Reks888 02.10.2010 15:17

Ответ: [?] проверка перечения точки и модели в цикле ...
 
Цитата:

Сообщение от polopok (Сообщение 163695)
и что ? где же ? ответы?

Этим постом ты нарушаешь одно из правил задачи вопросов:
Цитата:

x.y: Не делайте вид что вам кто-то что-то должен
Вскоре, вероятно, начнется срач, а тема отправится в биореактор
По теме: создавай пивот в нужной точке и проверяй с помощью MeshesIntersect

Brain 02.10.2010 15:34

Ответ: [?] проверка перечения точки и модели в цикле ...
 
Вложений: 1
Согласен, а по сабжу:

Ошибка в определении переменных:

Код:

                        s#= (Sqr(((yt1#-yt0#)* (zt2#-zt0#)-(zt1#-zt0#)* (yt2#-yt0#))^2+((zt1#-zt0#)* (xt2#-xt0#)-(xt1#-xt0#)* (zt2#-zt0#))^2+((xt1#-xt0#)* (yt2#-yt0#)-(yt1#-yt0#)* (xt2#-xt0#))^2))/2
                       
                        s1#= (Sqr(((yt1#-yt0#)* (zt#-zt0#)-(z1t#-zt0#)* (yt#-yt0#))^2+((zt1#-zt0#)* (xt#-xt0#)-(xt1#-xt0#)* (zt#-zt0#))^2+((xt1#-xt0#)* (yt#-yt0#)-(yt1#-yt0#)* (xt#-xt0#))^2))/2
                       
                        s2#= (Sqr(((yt#-yt0#)* (zt2#-zt0#)-(zt#-zt0#)* (yt2#-yt0#))^2+((zt#-zt0#)* (xt2#-xt0#)-(xt1#-xt0#)* (zt2#-zt0#))^2+((xt#-xt0#)* (yt2#-yt0#)-(yt#-yt0#)* (xt2#-xt0#))^2))/2
                       
                        s3#= (Sqr(((yt1#-yt#)* (zt2#-zt#)-(zt1#-zt#)* (yt2#-yt#))^2+((z1t#-zt#)* (xt2#-xt#)-(xt1#-xt#)* (zt2#-zt#))^2+((xt1#-xt#)* (yt2#-yt#)-(yt1#-yt#)* (x2#-x#))^2))/2

Переменные yt1#,yt0#,zt2#,zt0#,zt1# и тд не определены

Вообще советую пользоваться IDE с подсветкой синтаксиса, тогда таких глупых ошибок не будет


Часовой пояс GMT +4, время: 10:25.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot