Files
Ascent-of-Man/face.cpp
T
2026-11-08 11:22:15 +01:00

71 lines
1.8 KiB
C++

#include "face.h"
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)
{
bool b1, b2, b3;
//b1 = sign(pt, v1, v2) < 0.0f;
//b2 = sign(pt, v2, v3) < 0.0f;
// b3 = sign(pt, v3, v1) < 0.0f;
return ((b1 == b2) && (b2 == b3));
}
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);
/*float norm_len = sqrt(dot(norm, norm));
norm /= norm_len; */
}
QVector3D Face::normal()
{
return m_normal;
}
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->position().x() == s.x()) && (m_v1->position().y() == s.y())) ||
((m_v2->position().x() == s.x()) && (m_v2->position().y() == s.y())) ||
((m_v3->position().x()== s.x()) && (m_v3->position().y() == s.y()))
) {
vec.push_back(this);
}
}
}