72 lines
1.8 KiB
C++
72 lines
1.8 KiB
C++
#include "face.h"
|
|
#include <cmath>
|
|
|
|
float Face::sign (QVector2D p1, QVector2D p2, QVector2D p3)
|
|
{
|
|
return (p1.x() - p3.x()) * (p2.y() - p3.y()) - (p2.x() - p3.x()) * (p1.y() - p3.y());
|
|
}
|
|
|
|
bool Face::PointInFace (QVector2D pt)
|
|
{
|
|
Q_UNUSED(pt);
|
|
return true;
|
|
}
|
|
|
|
Face::Face(Vertex *v1,TileVertexInfo *vi1, Vertex *v2,TileVertexInfo *vi2,Vertex *v3,TileVertexInfo *vi3)
|
|
{m_subface= NULL;
|
|
setSettings(v1,vi1,v2,vi2,v3,vi3);
|
|
}
|
|
|
|
void Face::setSettings(Vertex *v1, TileVertexInfo *vi1, Vertex *v2, TileVertexInfo *vi2, Vertex *v3, TileVertexInfo *vi3)
|
|
{
|
|
m_v1 = v1;
|
|
m_v2 = v2;
|
|
m_v3 = v3;
|
|
m_vi1 = vi1;
|
|
m_vi2 = vi2;
|
|
m_vi3 = vi3;
|
|
recalcNormal();
|
|
}
|
|
|
|
void Face::recalcNormal()
|
|
{
|
|
QVector3D v1=QVector3D(m_v1->position().x(),m_v1->position().y(),m_vi1->height());
|
|
QVector3D v2=QVector3D(m_v2->position().x(),m_v2->position().y(),m_vi2->height());
|
|
QVector3D v3=QVector3D(m_v3->position().x(),m_v3->position().y(),m_vi3->height());
|
|
|
|
QVector3D va = v1 - v2;
|
|
QVector3D vb = v3 - v2;
|
|
m_normal = QVector3D::crossProduct(va,vb);
|
|
if (m_normal.z() < 0.0f) {
|
|
m_normal = -m_normal;
|
|
}
|
|
m_normal.normalize();
|
|
}
|
|
|
|
QVector3D Face::normal()
|
|
{
|
|
return m_normal;
|
|
}
|
|
|
|
static inline bool pointMatch(const QVector2D& p1, const QVector2D& p2)
|
|
{
|
|
return (std::abs(p1.x() - p2.x()) < 1e-4f) && (std::abs(p1.y() - p2.y()) < 1e-4f);
|
|
}
|
|
|
|
void Face::findFaces(std::vector<Face *> &vec, QVector2D s)
|
|
{
|
|
if (m_subface!=NULL) {
|
|
for (int i=0; i<4;i++) {
|
|
m_subface[i].findFaces(vec,s);
|
|
}
|
|
}
|
|
else {
|
|
if (m_v1 && m_v2 && m_v3 && (
|
|
pointMatch(m_v1->position(), s) ||
|
|
pointMatch(m_v2->position(), s) ||
|
|
pointMatch(m_v3->position(), s))) {
|
|
vec.push_back(this);
|
|
}
|
|
}
|
|
}
|