io3fix
Version:
toolkit for interior apps
97 lines (91 loc) • 2.84 kB
JavaScript
function getElement3d (el, center) {
let data = el.getAttribute('line-element')
delete data.color
let pos = el.getAttribute('position')
let rot = el.getAttribute('rotation')
data.x = round(pos.x)
data.y = round(pos.y)
data.z = round(pos.z)
data.ry = round(rot.y)
// clean up data
if (data.type === 'wall') {
var w = {
x: -data.w * Math.cos(data.ry * Math.PI / 180 + Math.PI / 2),
z: data.w * Math.sin(data.ry * Math.PI / 180 + Math.PI / 2)
}
if (!center) {
data.x -= w.x / 2
data.z -= w.z / 2
}
data.h = 2.4
data.y = 0
} else if (data.type === 'door') {
data.h = 2
data.y = 0
} else if (data.type === 'window') {
data.h = 1.2
data.y = 0.8
}
return data
}
// get wall points + vectors
function getWallData (wall) {
var
wallAngle = wall.ry / 180 * Math.PI,
// width vector
w = {
x: -wall.w * Math.cos(wallAngle + Math.PI / 2),
z: wall.w * Math.sin(wallAngle + Math.PI / 2)
},
// Base Line Points
p1 = {
x: wall.x,
z: wall.z
},
p2 = {
x: wall.x + wall.l * Math.cos(wallAngle),
z: wall.z - wall.l * Math.sin(wallAngle)
}
return {wallAngle: wallAngle, p1: p1, p2: p2, w: w}
}
function pointOnWall (p, wall, snapToPoint) {
const data = getWallData(wall)
// get intersection point
const _p = intersection(p, {x: p.x + data.w.x, z: p.z + data.w.z}, data.p1, data.p2)
// see if intersection is on the wall
const d1 = distance(_p, data.p1)
const d2 = distance(_p, data.p2)
const dl = distance(data.p1, data.p2)
// return closest wall point if asked for
if (snapToPoint) {
return (d1 > d2) ? data.p2 : data.p1
}
else if (d1 > dl) return data.p2
else if (d2 > dl) return data.p1
else return _p
}
function getPolygonArea(polygon) {
var numPoints = polygon.length
var area = 0 // Accumulates area in the loop
var j = numPoints - 1 // The last vertex is the 'previous' one to the first
for (var i = 0; i < numPoints; i++) {
area = area + (polygon[ j ][ 0 ] + polygon[ i ][ 0 ]) * (polygon[ j ][ 1 ] - polygon[ i ][ 1 ])
j = i //j is previous vertex to i
}
area = Math.round(Math.abs(area / 2)*100)/100
return area
}
// intersections line p and q
function intersection (p1, p2, q1, q2) {
return {
x: ((q2.x - q1.x) * (p2.x * p1.z - p1.x * p2.z) - (p2.x - p1.x) * (q2.x * q1.z - q1.x * q2.z)) / ((q2.z - q1.z) * (p2.x - p1.x) - (p2.z - p1.z) * (q2.x - q1.x)),
z: ((p1.z - p2.z) * (q2.x * q1.z - q1.x * q2.z) - (q1.z - q2.z) * (p2.x * p1.z - p1.x * p2.z)) / ((q2.z - q1.z) * (p2.x - p1.x) - (p2.z - p1.z) * (q2.x - q1.x)),
}
}
// distance between points
function distance (p, q) {
return Math.sqrt(Math.pow((p.x - q.x), 2) + Math.pow((p.z - q.z), 2))
}
function rnd (a) {
return Math.round(a * 100) / 100
}