среда, 3 июня 2015 г.

Test face intesection.




----------------------------------------------------------------------------------
rollout testFaceInt "test Face Intersection" width:400
(
    button create01 "Create" width:100 align:#center
    group "Parameters T1"
    (
        label lblt0 "M1 [x1, y1, z1], M2 [x2, y2, z2], M3 [x3, y3, z3]" align:#center
        label lblt1 "-------------------------------------" align:#center
        spinner x1 "x1  " width:100    range:[-1000.0,1000.0,-5.9] type:#float align:#right across:3
        spinner y1 "y1" width:100  range:[-1000.0,1000.0,-8.5] type:#float align:#right
        spinner z1 "z1 " width:100 range:[-1000.0,1000.0,12.5] type:#float   align:#right
        label lblt2 "-------------------------------------" align:#center
        spinner x2 "x2  " width:100    range:[-1000.0,1000.0,-9.4] type:#float align:#right across:3
        spinner y2 "y2" width:100  range:[-1000.0,1000.0,-12.7] type:#float align:#right
        spinner z2 "z2 " width:100 range:[-1000.0,1000.0,3.8] type:#float   align:#right
        label lblt3 "-------------------------------------" align:#center
        spinner x3 "x3  " width:100    range:[-1000.0,1000.0,-4.3] type:#float align:#right across:3
        spinner y3 "y3" width:100  range:[-1000.0,1000.0,-11.2] type:#float align:#right
        spinner z3 "z3 " width:100 range:[-1000.0,1000.0,10.2] type:#float   align:#right
    )       
    group "Parameters T2"
    (
        label lblt4 "A [a1, b1, c1], B [a2, b2, c2], C [a3, b3, c3]" align:#center
        label lblt5 "-------------------------------------" align:#center
        spinner a1 "a1  " width:100    range:[-1000.0,1000.0,-10.3] type:#float align:#right across:3
        spinner b1 "b1" width:100  range:[-1000.0,1000.0,-3.8] type:#float align:#right
        spinner c1 "c1 " width:100 range:[-1000.0,1000.0,14.0] type:#float   align:#right
        label lblt6 "-------------------------------------" align:#center
        spinner a2 "a2  " width:100    range:[-1000.0,1000.0,-8.8] type:#float align:#right across:3
        spinner b2 "b2" width:100  range:[-1000.0,1000.0,-9.8] type:#float align:#right
        spinner c2 "c2 " width:100 range:[-1000.0,1000.0,7.7] type:#float   align:#right
        label lblt7 "-------------------------------------" align:#center
        spinner a3 "a3  " width:100    range:[-1000.0,1000.0,-2.2] type:#float align:#right across:3
        spinner b3 "b3" width:100  range:[-1000.0,1000.0,-5.5] type:#float align:#right
        spinner c3 "c3 " width:100 range:[-1000.0,1000.0,3.3] type:#float   align:#right
    )   
--**********************
fn createM =
(
    try(delete objects)catch()
    local vert_array = #(), face_array = #(),
            v1 = [x1.value, y1.value, z1.value],
            v2 = [x2.value, y2.value, z2.value],
            v3 = [x3.value, y3.value, z3.value]
    local v11 = [a1.value, b1.value, c1.value],
            v22 = [a2.value, b2.value, c2.value],
            v33 = [a3.value, b3.value, c3.value]   
    vert_array = #(v1,v2,v3,v11,v22,v33)
    face_array = #([1,2,3], [4,5,6])

    local m = mesh vertices:vert_array faces:face_array
    m.name = uniquename "triag"
    )
--*********************
fn createOneVector startV endV theCol =
(
    local theThicness = 0.1
    local theV = endV - startV
    local theDir = normalize theV
    local theH = length theV
    local cyl = cylinder pos:startV dir: theDir height: (0.9*theH) radius:(theThicness/5.0) name: (uniquename "Vector")
    local con = cone pos:(startV + 0.9*theV) dir: theDir height: (0.1*theH) radius1:(theThicness/2.0) name: (uniquename "VectorArrow")
    cyl.wirecolor = theCol
    con.wirecolor = theCol
    )
--*********************   
fn createOneText thePos theText theCol =
(
    local textSize = 0.6
    local theVS = getViewSize()
    local theRay = mapScreenToWorldRay (theVS/2.0)
    local t = text text:theText size:textSize pos: thePos dir: -theRay.dir
    t.wirecolor = theCol
    )
fn createText =
(
    createOneText [x1.value, y1.value, z1.value] "M1" red
    createOneText [x2.value, y2.value, z2.value] "M2" red
    createOneText [x3.value, y3.value, z3.value] "M3" red
   
    createOneText [a1.value, b1.value, c1.value] "A" red
    createOneText [a2.value, b2.value, c2.value] "B" red
    createOneText [a3.value, b3.value, c3.value] "C" red
    )
--************************   
fn PointInFace P1 P2 P3 P =
(
    local vec1 = P2 - P1
    local vec2 = P3 - P1
    local squareFace = (length(cross vec1 vec2))/2.0
-----
    local vec3 = P1 - P
    local vec4 = P2 - P
    local squareFace1 = (length(cross vec3 vec4))/2.0
-----
    local vec5 = P2 - P
    local vec6 = P3 - P
    local squareFace2 = (length(cross vec5 vec6))/2.0
----
    local vec7 = P3 - P
    local vec8 = P1 - P
    local squareFace3 = (length(cross vec7 vec8))/2.0
   
local sumArea = squareFace1 + squareFace2 + squareFace3
if sumArea <= 1.000001*squareFace then return(true) else return(false)
   
    )   
--************************   
fn createVectors =
(
local A = [a1.value, b1.value, c1.value],
        B = [a2.value, b2.value, c2.value],
        C = [a3.value, b3.value, c3.value],
        M1 = [x1.value, y1.value, z1.value],
        M2 = [x2.value, y2.value, z2.value],
        M3 = [x3.value, y3.value, z3.value]
   
local N1 = cross (B-A) (C-A),
        N2 = N1/(length N1),
        cent1 = (A+B+C)/3.0
local N3 = cross (M2-M1) (M3-M1),
        N4 = N3/(length N3),
        cent2 = (M1+M2+M3)/3.0
   
createOneVector cent1 (cent1 + N2) blue
createOneVector cent2 (cent2 + N4) blue
createOneVector [0,0,0] A green
createOneVector [0,0,0] B green
createOneVector [0,0,0] C green
createOneVector [0,0,0] M1 green
createOneVector [0,0,0] M2 green
createOneVector [0,0,0] M3 green
    )
--************************   
fn findInterLinePlane planeP1 planeP2 planeP3 lineP1 lineP2 =
(
    local n = cross (planeP2-planeP1) (planeP3-planeP1)
    local normalPlane = n/(length n)

local V = planeP1 - lineP1,
        D = dot normalPlane V,
        W = lineP2 - lineP1,
        theE = dot normalPlane W
local thePos = if theE != 0 then lineP1 + W*D/theE else (lineP1 + lineP2)/2.0
   
local LengthPos = length (lineP1 - thePos) + length (lineP2 - thePos)
local lengthLine = 1.000001*length(lineP1 - lineP2)

if (LengthPos <= lengthLine) and (PointInFace planeP1 planeP2 planeP3 thePos == true) then return(thePos) else return(undefined)
    )
--************************   
fn findTriagInter =
(
local A = [a1.value, b1.value, c1.value],
        B = [a2.value, b2.value, c2.value],
        C = [a3.value, b3.value, c3.value],
        M1 = [x1.value, y1.value, z1.value],
        M2 = [x2.value, y2.value, z2.value],
        M3 = [x3.value, y3.value, z3.value]
if findInterLinePlane A B C M1 M2 != undefined do point pos: (findInterLinePlane A B C M1 M2) size:1
if findInterLinePlane A B C M1 M3 != undefined do point pos: (findInterLinePlane A B C M1 M3) size:1
if findInterLinePlane A B C M2 M3 != undefined do point pos: (findInterLinePlane A B C M2 M3) size:1
----
if findInterLinePlane M1 M2 M3 A B != undefined do point pos: (findInterLinePlane M1 M2 M3 A B) size:1
if findInterLinePlane M1 M2 M3 A C != undefined do point pos: (findInterLinePlane M1 M2 M3 A C) size:1
if findInterLinePlane M1 M2 M3 B C != undefined do point pos: (findInterLinePlane M1 M2 M3 B C) size:1

local thePoints = $Point* as array
if thePoints.count == 2 do createOneVector thePoints[1].pos thePoints[2].pos red
    )
--************************   
fn theAllFunc =
(
    createM()
    createText()
    createVectors()
    findTriagInter()
    )
   
--************************
   
on create01 pressed do theAllFunc()   
--------------------------------   
on x1 changed val do theAllFunc()
on y1 changed val do theAllFunc()
on z1 changed val do theAllFunc()
on x2 changed val do theAllFunc()
on y2 changed val do theAllFunc()
on z2 changed val do theAllFunc()
on x3 changed val do theAllFunc()
on y3 changed val do theAllFunc()
on z3 changed val do theAllFunc()
---------------------------------
on a1 changed val do theAllFunc()
on b1 changed val do theAllFunc()
on c1 changed val do theAllFunc()
on a2 changed val do theAllFunc()
on b2 changed val do theAllFunc()
on c2 changed val do theAllFunc()
on a3 changed val do theAllFunc()   
on b3 changed val do theAllFunc()
on c3 changed val do theAllFunc()
)--end rollout
createDialog testFaceInt 

----------------------------------------------------------------------------------

Комментариев нет:

Отправить комментарий