Ответ: как найти точку в треугольнике 3d в координатах?
ничего не получается !!!!!
вот два примера кода :
1)
Код:
Type Point3D
Field x#,y#,z#
End Type
Graphics3D 640,480
SetBuffer BackBuffer()
camera=CreateCamera() :PositionEntity camera, 0 ,0 ,-4
light=CreateLight()
Global x#,y#,z#, x0#,y0#,z0#, x1#,y1#,z1#, x2#,y2#,z2# ,s#,s1#,s2#,s3#,dlt#,intriangle
Global xx1#,yy1#,zz1#,xx2#,yy2#,zz2#,xx0#,yy0#,zz0#
x#=0 :y#=0 :z#=0 : x0#=0 :y0#=0 :z0#=0 : x1#=0 :y1#=-2 :z1#=0 : x2#=2 :y2#=1 :z2=0
sp= CreateSphere() :sp0= CreateSphere() :sp1= CreateSphere() :sp2= CreateSphere()
ScaleEntity sp, 0.1, 0.1, 0.1 :ScaleEntity sp0, 0.1, 0.1, 0.1 :ScaleEntity sp1, 0.1, 0.1, 0.1 :ScaleEntity sp2, 0.1, 0.1, 0.1
PositionEntity sp, x#, y#, z# :PositionEntity sp0, x0#, y0#, z0# :PositionEntity sp1, x1#, y1#, z1# :PositionEntity sp2, x2#, y2#, z2#
EntityColor sp, 255, 255, 255 :EntityColor sp0, 255, 0, 0 :EntityColor sp1, 0, 255, 0 :EntityColor sp2, 0, 0, 255
CreatePoint3D.Point3D(x#,y#,z#)
CreatePoint3D.Point3D(x1#,y1#,z1#)
CreatePoint3D.Point3D(x2#,y2#,z2#)
CreatePoint3D.Point3D(x0#,y0#,z0#)
;m= CreateMesh()
;s= CreateSurface(m)
;v0 = AddVertex (s, x0, y0, z0, 0 ,0)
;v1 = AddVertex (s, x1, y1, z1, 1 ,0)
;v2 = AddVertex (s, y2, y2, z2, 1,1)
;tri = AddTriangle (s,v0,v1,v2)
;UpdateNormals m :EntityFX m, 1+16
While Not KeyDown( 1 ) ; 1 - esc
s= get_triangle_dim(p1.Point3D, p2.Point3D, p3.Point3D)
s1= get_triangle_dim(p1.Point3D, p2.Point3D, p3.Point3D)
s2= get_triangle_dim(p1.Point3D, p2.Point3D, p3.Point3D)
s3= get_triangle_dim(p1.Point3D, p2.Point3D, p3.Point3D)
If s= (s1+s2+s3) Then intriangle=1111111111 Else intriangle=0
;x# = MouseX() : y# = MouseY()
If KeyDown( 203 )=True Then x# = x# -.01*00.5 ; V strelka vniz
If KeyDown( 205 )=True Then x# = x# +.01*00.5 ; ^ strelka vverh
If KeyDown( 208 )=True Then y# = y# -.01*00.5 ; < strelka vlevo
If KeyDown( 200 )=True Then y# = y# +.01*00.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#
CameraProject (camera ,EntityX(sp0) ,EntityY(sp0) ,EntityZ(sp0))
spp0_x= ProjectedX#() :spp0_y= ProjectedY#()
CameraProject (camera ,EntityX(sp1) ,EntityY(sp1) ,EntityZ(sp1))
spp1_x= ProjectedX#() :spp1_y= ProjectedY#()
CameraProject (camera ,EntityX(sp2) ,EntityY(sp2) ,EntityZ(sp2))
spp2_x= ProjectedX#() :spp2_y= ProjectedY#()
CameraProject (camera ,EntityX(sp) ,EntityY(sp) ,EntityZ(sp))
spp_x= ProjectedX#() :spp_y= ProjectedY#()
UpdateWorld
RenderWorld
Line spp0_x ,spp0_y ,spp1_x ,spp1_y
Line spp1_x ,spp1_y ,spp2_x ,spp2_y
Line spp2_x ,spp2_y ,spp0_x ,spp0_y
Line spp0_x ,spp0_y ,spp_x ,spp_y
Line spp1_x ,spp1_y ,spp_x ,spp_y
Line spp2_x ,spp2_y ,spp_x ,spp_y
Text 0, 0, " GPIQ = "+intriangle+" S= "+s#+" S1= "+s1#+" S2= "+s2#+" S3= "+s3#;+" "++" "++" "++" "++" "++" "++" "++
Flip : Wend : ClearWorld : End
;------------------------------------------------------------------------------
Function CreatePoint3D.Point3D(x#,y#,z#)
Local p.Point3D = New Point3D
px=x
py=y
pz=z
Return p
End Function
Function get_triangle_dim(p1.Point3D, p2.Point3D, p3.Point3D)
v1x= p2x- p1x;
v1y= p2y- p1y;
v1z= p2z- p1z;
v2x= p3x- p1x;
v2y= p3y- p1y;
v2z= p3z- p1z;
vpx= v1y *v2z -v1z*v2y;
vpy= v1z *v2x -v1x*v2z;
vpz= v1x *v2y -v1y*v2x;
Return(Sqr(vpx *vpx +vpy *vpy +vpz *vpz)/2);
End Function
2)
Код:
Graphics3D 640,480
SetBuffer BackBuffer()
camera=CreateCamera() :PositionEntity camera, 0 ,0 ,-4
light=CreateLight()
Global x#,y#,z#, x0#,y0#,z0#, x1#,y1#,z1#, x2#,y2#,z2# ,s#,s1#,s2#,s3#,dlt#,intriangle
Global xx1#,yy1#,zz1#,xx2#,yy2#,zz2#,xx0#,yy0#,zz0#
x#=0 :y#=0 :z#=0 : x0#=0 :y0#=0 :z0#=0 : x1#=0 :y1#=-2 :z1#=0 : x2#=2 :y2#=1 :z2=0
sp= CreateSphere() :sp0= CreateSphere() :sp1= CreateSphere() :sp2= CreateSphere()
ScaleEntity sp, 0.1, 0.1, 0.1 :ScaleEntity sp0, 0.1, 0.1, 0.1 :ScaleEntity sp1, 0.1, 0.1, 0.1 :ScaleEntity sp2, 0.1, 0.1, 0.1
PositionEntity sp, x#, y#, z# :PositionEntity sp0, x0#, y0#, z0# :PositionEntity sp1, x1#, y1#, z1# :PositionEntity sp2, x2#, y2#, z2#
EntityColor sp, 255, 255, 255 :EntityColor sp0, 255, 0, 0 :EntityColor sp1, 0, 255, 0 :EntityColor sp2, 0, 0, 255
;m= CreateMesh()
;s= CreateSurface(m)
;v0 = AddVertex (s, x0, y0, z0, 0 ,0)
;v1 = AddVertex (s, x1, y1, z1, 1 ,0)
;v2 = AddVertex (s, y2, y2, z2, 1,1)
;tri = AddTriangle (s,v0,v1,v2)
;UpdateNormals m :EntityFX m, 1+16
While Not KeyDown( 1 ) ; 1 - esc
s= get_triangle_dim#(x1#,y1#,z1#,x2#,y2#,z2#,x0#,y0#,z0#)
s0= get_triangle_dim#(x#,y#,z#,x2#,y2#,z2#,x0#,y0#,z0#)
s1= get_triangle_dim#(x1#,y1#,z1#,x#,y#,z#,x0#,y0#,z0#)
s2= get_triangle_dim#(x1#,y1#,z1#,x2#,y2#,z2#,x#,y#,z#)
If s= (s1+s2+s0) Then intriangle=1111111111 Else intriangle=0
;x# = MouseX() : y# = MouseY()
If KeyDown( 203 )=True Then x# = x# -.01*00.5 ; V strelka vniz
If KeyDown( 205 )=True Then x# = x# +.01*00.5 ; ^ strelka vverh
If KeyDown( 208 )=True Then y# = y# -.01*00.5 ; < strelka vlevo
If KeyDown( 200 )=True Then y# = y# +.01*00.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#
CameraProject (camera ,EntityX(sp0) ,EntityY(sp0) ,EntityZ(sp0))
spp0_x= ProjectedX#() :spp0_y= ProjectedY#()
CameraProject (camera ,EntityX(sp1) ,EntityY(sp1) ,EntityZ(sp1))
spp1_x= ProjectedX#() :spp1_y= ProjectedY#()
CameraProject (camera ,EntityX(sp2) ,EntityY(sp2) ,EntityZ(sp2))
spp2_x= ProjectedX#() :spp2_y= ProjectedY#()
CameraProject (camera ,EntityX(sp) ,EntityY(sp) ,EntityZ(sp))
spp_x= ProjectedX#() :spp_y= ProjectedY#()
UpdateWorld
RenderWorld
Line spp0_x ,spp0_y ,spp1_x ,spp1_y
Line spp1_x ,spp1_y ,spp2_x ,spp2_y
Line spp2_x ,spp2_y ,spp0_x ,spp0_y
Line spp0_x ,spp0_y ,spp_x ,spp_y
Line spp1_x ,spp1_y ,spp_x ,spp_y
Line spp2_x ,spp2_y ,spp_x ,spp_y
Text 0, 0, " GPIQ = "+intriangle+" S= "+s#+" S1= "+s1#+" S2= "+s2#+" S3= "+s3#;+" "++" "++" "++" "++" "++" "++" "++
Flip : Wend : ClearWorld : End
Function get_triangle_dim#(xx1#,yy1#,zz1#,xx2#,yy2#,zz2#,xx0#,yy0#,zz0#)
Local vx1#,vy1#,vz1#,vxp#,vyp#,vzp#
vx1=xx2-xx1
vy1=yy2-yy1
vz1=zz2-zz1
vx2=xx0-xx1
vy2=yy0-yy1
vz2=zz0-zz1
vxp=yy1*zz2-zz1*yy2
vyp=zz1*xx2-xx1*z2
vzp =xx1*yy2-yy1*xx2
Return (Sqr (vxp*vxp+vyp*vyp+vzp*vzp)/2)
End Function
ужассссс!!!!
вод код находит точку в треугольнике 3д пространстве , но только по оси X ,Y
Код:
Graphics3D 640,480
SetBuffer BackBuffer()
camera=CreateCamera() :PositionEntity camera, 0 ,0 ,-4
light=CreateLight()
Global x#,y#,z#, x0#,y0#,z0#, x1#,y1#,z1#, x2#,y2#,z2# ,s#,s1#,s2#,s3#,intriangle
x#=0 :y#=0 :z#=0 : x0#=0 :y0#=0 :z0#=0 : x1#=0 :y1#=-2 :z1#=0 : x2#=2 :y2#=1 :z2=0
sp= CreateSphere() :sp0= CreateSphere() :sp1= CreateSphere() :sp2= CreateSphere()
ScaleEntity sp, 0.1, 0.1, 0.1 :ScaleEntity sp0, 0.1, 0.1, 0.1 :ScaleEntity sp1, 0.1, 0.1, 0.1 :ScaleEntity sp2, 0.1, 0.1, 0.1
PositionEntity sp, x#, y#, z# :PositionEntity sp0, x0#, y0#, z0# :PositionEntity sp1, x1#, y1#, z1# :PositionEntity sp2, x2#, y2#, z2#
EntityColor sp, 255, 255, 255 :EntityColor sp0, 255, 0, 0 :EntityColor sp1, 0, 255, 0 :EntityColor sp2, 0, 0, 255
;m= CreateMesh()
;s= CreateSurface(m)
;v0 = AddVertex (s, x0, y0, z0, 0 ,0)
;v1 = AddVertex (s, x1, y1, z1, 1 ,0)
;v2 = AddVertex (s, y2, y2, z2, 1,1)
;tri = AddTriangle (s,v0,v1,v2)
;UpdateNormals m :EntityFX m, 1+16
While Not KeyDown( 1 ) ; 1 - esc
s#=0.5*Abs((x2#-x1#)*(y0#-y1#)-(x0#-x1#)*(y0#-y1#)); // ??????? ???????????? (?1,?1)(?2,?2)(?3,?3)
s1#=0.5*Abs((x2#-x#)*(y0#-y#)-(x0#-x#)*(y2#-y#)); // ??????? ???????????? (?,?)(?2,?2)(?3,?3)
s2#=0.5*Abs((x#-x1#)*(y0#-y1#)-(x0#-x1#)*(y#-y1#)); // ??????? ???????????? (?1,?1)(?,?)(?3,?3)
s3#=0.5*Abs((x2#-x1#)*(y#-y1#)-(x#-x1#)*(y2#-y1#)); // ??????? ???????????? (?1,?1)(?2,?2)(?,?)
dlt#=s#*0.0001
If Abs(s# -(s1# +s2# +s3)) <dlt# intriangle=1111111111 Else intriangle=0
If KeyDown( 203 )=True Then x# = x# -.01*00.5 ; V strelka vniz
If KeyDown( 205 )=True Then x# = x# +.01*00.5 ; ^ strelka vverh
If KeyDown( 208 )=True Then y# = y# -.01*00.5 ; < strelka vlevo
If KeyDown( 200 )=True Then y# = y# +.01*00.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#
CameraProject (camera ,EntityX(sp0) ,EntityY(sp0) ,EntityZ(sp0))
spp0_x= ProjectedX#() :spp0_y= ProjectedY#()
CameraProject (camera ,EntityX(sp1) ,EntityY(sp1) ,EntityZ(sp1))
spp1_x= ProjectedX#() :spp1_y= ProjectedY#()
CameraProject (camera ,EntityX(sp2) ,EntityY(sp2) ,EntityZ(sp2))
spp2_x= ProjectedX#() :spp2_y= ProjectedY#()
CameraProject (camera ,EntityX(sp) ,EntityY(sp) ,EntityZ(sp))
spp_x= ProjectedX#() :spp_y= ProjectedY#()
UpdateWorld
RenderWorld
Line spp0_x ,spp0_y ,spp1_x ,spp1_y
Line spp1_x ,spp1_y ,spp2_x ,spp2_y
Line spp2_x ,spp2_y ,spp0_x ,spp0_y
Line spp0_x ,spp0_y ,spp_x ,spp_y
Line spp1_x ,spp1_y ,spp_x ,spp_y
Line spp2_x ,spp2_y ,spp_x ,spp_y
Text 0, 0, " GPIQ = "+intriangle+" S= "+s+" S1= "+s1+" S2= "+s2+" S3= "+s3;+" "++" "++" "++" "++" "++" "++" "++
Flip : Wend : ClearWorld : End
|