void MainWindow::autoMeshInternal(TriangleListPtr trianglesFront, TriangleListPtr trianglesBack, struct predgparam3f_s *param, double targetRadius, int component, double minU, double maxU, double minV, double maxV, int maxSubdivisions, int subdivision) { struct spin3f_s sp00, sp01, sp10, sp11; predgparam3f_eval(&sp00, param, minU, minV, component); predgparam3f_eval(&sp01, param, minU, maxV, component); predgparam3f_eval(&sp10, param, maxU, minV, component); predgparam3f_eval(&sp11, param, maxU, maxV, component); if (subdivision == maxSubdivisions || (projectedDistance(&sp00, &sp01) <= targetRadius && projectedDistance(&sp00, &sp10) <= targetRadius && projectedDistance(&sp00, &sp11) <= targetRadius && projectedDistance(&sp01, &sp10) <= targetRadius && projectedDistance(&sp01, &sp11) <= targetRadius && projectedDistance(&sp10, &sp11) <= targetRadius)) { QVector3D v00(sp00.s12 / (1 - sp00.s0), sp00.s23 / (1 - sp00.s0), sp00.s31 / (1 - sp00.s0)); QVector3D v01(sp01.s12 / (1 - sp01.s0), sp01.s23 / (1 - sp01.s0), sp01.s31 / (1 - sp01.s0)); QVector3D v10(sp10.s12 / (1 - sp10.s0), sp10.s23 / (1 - sp10.s0), sp10.s31 / (1 - sp10.s0)); QVector3D v11(sp11.s12 / (1 - sp11.s0), sp11.s23 / (1 - sp11.s0), sp11.s31 / (1 - sp11.s0)); trianglesFront->push_back(Triangle(v00, v01, v11)); trianglesFront->push_back(Triangle(v00, v11, v10)); trianglesBack->push_back(Triangle(v00, v11, v01)); trianglesBack->push_back(Triangle(v00, v10, v11)); } else { autoMeshInternal(trianglesFront, trianglesBack, param, targetRadius, component, minU, minU + 0.5 * (maxU - minU), minV, minV + 0.5 * (maxV - minV), maxSubdivisions, subdivision + 1); autoMeshInternal(trianglesFront, trianglesBack, param, targetRadius, component, minU, minU + 0.5 * (maxU - minU), minV + 0.5 * (maxV - minV), maxV, maxSubdivisions, subdivision + 1); autoMeshInternal(trianglesFront, trianglesBack, param, targetRadius, component, minU + 0.5 * (maxU - minU), maxU, minV, minV + 0.5 * (maxV - minV), maxSubdivisions, subdivision + 1); autoMeshInternal(trianglesFront, trianglesBack, param, targetRadius, component, minU + 0.5 * (maxU - minU), maxU, minV + 0.5 * (maxV - minV), maxV, maxSubdivisions, subdivision + 1); } }
/*! Returns the minimum distance from this ray to \a point, or equivalently the length of a line perpendicular to this ray which passes through \a point. If \a point is on the ray, then this function will return zero. \sa point() */ float QRay3D::distance(const QVector3D &point) const { float t = projectedDistance(point); return (point - (m_origin + t * m_direction)).length(); }