worked on 3D walls

This commit is contained in:
k-a-z-u
2018-07-24 18:08:08 +02:00
parent 3d79fd5af0
commit f7e4323d58
11 changed files with 261 additions and 49 deletions

View File

@@ -3,9 +3,12 @@
#include "../../geo/Line2.h"
#include "../../geo/Polygon2.h"
#include "../../geo/GPCPolygon2.h"
#include "Walls.h"
#include "misc.h"
#include <functional>
#include <iostream>
namespace Floorplan3D {
@@ -174,32 +177,133 @@ namespace Floorplan3D {
Obstacle3D obs(type, wall.line->material);
const float z1 = fp.z1;
const float z2 = fp.z2;
const float z2 = (wall.line->height_m > 0) ? (fp.z1 + wall.line->height_m) : (fp.z2);
const Point3 p1 = Point3(wall.getP1().x, wall.getP1().y, z1);
const Point3 p2 = Point3(wall.getP2().x, wall.getP2().y, z1);
const Point3 p3 = Point3(wall.getP3().x, wall.getP3().y, z1);
const Point3 p4 = Point3(wall.getP4().x, wall.getP4().y, z1);
// const Point3 p1 = Point3(wall.getP1().x, wall.getP1().y, z1);
// const Point3 p2 = Point3(wall.getP2().x, wall.getP2().y, z1);
// const Point3 p3 = Point3(wall.getP3().x, wall.getP3().y, z1);
// const Point3 p4 = Point3(wall.getP4().x, wall.getP4().y, z1);
const Point3 p1u = Point3(wall.getP1().x, wall.getP1().y, z2);
const Point3 p2u = Point3(wall.getP2().x, wall.getP2().y, z2);
const Point3 p3u = Point3(wall.getP3().x, wall.getP3().y, z2);
const Point3 p4u = Point3(wall.getP4().x, wall.getP4().y, z2);
// const Point3 p1u = Point3(wall.getP1().x, wall.getP1().y, z2);
// const Point3 p2u = Point3(wall.getP2().x, wall.getP2().y, z2);
// const Point3 p3u = Point3(wall.getP3().x, wall.getP3().y, z2);
// const Point3 p4u = Point3(wall.getP4().x, wall.getP4().y, z2);
obs.addQuad(p1, p2, p2u, p1u);
obs.addQuad(p2, p3, p3u, p2u);
obs.addQuad(p3, p4, p4u, p3u);
obs.addQuad(p4, p1, p1u, p4u);
// obs.addQuad(p1, p2, p2u, p1u);
// obs.addQuad(p2, p3, p3u, p2u);
// obs.addQuad(p3, p4, p4u, p3u);
// obs.addQuad(p4, p1, p1u, p4u);
obs.addQuad(p1u, p2u, p3u, p4u);
obs.addQuad(p4, p3, p2, p1);
// obs.addQuad(p1u, p2u, p3u, p4u);
// obs.addQuad(p4, p3, p2, p1);
obs.reverseFaces();
// obs.reverseFaces();
// return obs;
Point3 p0 = Point3(wall.line->from.x, wall.line->from.y, z1);
Point3 p1 = Point3(wall.getP1().x, wall.getP1().y, z1);
Point3 p2 = Point3(wall.getP2().x, wall.getP2().y, z1);
Point3 p3 = Point3(wall.getP3().x, wall.getP3().y, z1);
Point3 p4 = Point3(wall.getP4().x, wall.getP4().y, z1);
Point3 p1u = Point3(wall.getP1().x, wall.getP1().y, z2);
Point3 p2u = Point3(wall.getP2().x, wall.getP2().y, z2);
Point3 p3u = Point3(wall.getP3().x, wall.getP3().y, z2);
Point3 p4u = Point3(wall.getP4().x, wall.getP4().y, z2);
Point3 o = p0;
float t = wall.line->thickness_m / 2;
const Point3 o1;// = p1;
const Point3 o2;// = p4;
const float a = std::atan2(wall.getP2().y - wall.getP1().y, wall.getP2().x - wall.getP1().x);
auto flatten = [a,o] (const Point3 p) {return (p - o).rotZ(-a).xz();};
//auto flatten2 = [a,o] (const Point3 p) {return (p - o).rotZ(-a).xz();};
auto unFlattenFront = [o,t,a] (const Point3 p) {return Point3(p.x, +t, p.y).rotZ(a)+o;};
auto unFlattenBack = [o,t,a] (const Point3 p) {return Point3(p.x, -t, p.y).rotZ(a)+o;};
const Point2 fp1 = flatten(p1);
const Point2 fp2 = flatten(p2);
const Point2 fp3 = flatten(p3);
const Point2 fp4 = flatten(p4);
const Point2 fp1u = flatten(p1u);
const Point2 fp2u = flatten(p2u);
const Point2 fp3u = flatten(p3u);
const Point2 fp4u = flatten(p4u);
Polygon2 front;
front.add({fp1, fp2, fp2u, fp1u});
GPCPolygon2 gpFront;
gpFront.add(front);
Polygon2 back;
back.add({fp3, fp4, fp4u, fp3u});
GPCPolygon2 gpBack;
gpBack.add(back);
for (const Floorplan::FloorObstacleWallDoor* door : wall.line->doors) {
Polygon2 pDoor;
const Point2 pds = door->getStart(wall.line);
const Point2 pde = door->getEnd(wall.line);
const Point3 dp1(pds.x, pds.y, z1);
const Point3 dp2(pde.x, pde.y, z1);
const Point3 dp2u(pde.x, pde.y, z1+door->height);
const Point3 dp1u(pds.x, pds.y, z1+door->height);
//auto flattenD1 = [dp1,a] (const Point3 p) {return (p - dp1).rotZ(-a).xz();};
//auto unFlatten1 = [dp1,a] (const Point3 p) {return Point3(p.x, 0, p.y).rotZ(a)+dp1;};
pDoor.add(flatten(dp1));
pDoor.add(flatten(dp2));
pDoor.add(flatten(dp2u));
pDoor.add(flatten(dp1u));
gpFront.remove(pDoor);
gpBack.remove(pDoor);
}
std::vector<Triangle3> triasFront = gpFront.getTriangles();
for (Triangle3 tria : triasFront) {
fixTria(tria, unFlattenFront);
tria.reverse();
obs.triangles.push_back(tria);
}
std::vector<Triangle3> triasBack = gpBack.getTriangles();
for (Triangle3 tria : triasBack) {
fixTria(tria, unFlattenBack);
obs.triangles.push_back(tria);
}
// for (const Floorplan::FloorObstacleWallDoor* door : wall.line->doors) {
// const Point2 p1 = door->getStart(wall.line);
// const Point2 p2 = door->getEnd(wall.line);
// }
return obs;
}
void fixTria(Triangle3& t, std::function<Point3(Point3)> func) {
t.p1 = func(t.p1);
t.p2 = func(t.p2);
t.p3 = func(t.p3);
}
/** cut off walls ending within another wall */
std::vector<Wall> cutProtruding(std::vector<Wall> walls) {