修改了一些精度问题

dev-VirtualTexture
wuyize 2022-10-17 16:51:31 +08:00
parent 6ca1b334bf
commit 656fa704a7
4 changed files with 11 additions and 11 deletions

View File

@ -4,7 +4,7 @@ double CubicBezier::getLineValueByT(double t, bool isY) {
vector<double> p;
if (isY) p = vY;
else p = vX;
float pt = 1 - t;
double pt = 1 - t;
return pt * pt * pt * p[0] + 3 * t * pt * pt * p[1] + 3 * t * t * pt * p[2] + t * t * t * p[3];
}
@ -106,7 +106,7 @@ int CubicBezier::judgeBoundIntersection(double xy, double l, double r, bool isY)
valueBegin = *vY.begin();
valueEnd = *vY.rbegin();
}
if ((valueBegin - xy) * (valueEnd - xy) >= eps) return 0;
if ((valueBegin - xy) * (valueEnd - xy) >= 0) return 0;
double t = findTByValue(xy, isY);
double value = getLineValueByT(t, !isY);
if (l <= value && value <= r && fabs(t) > eps && fabs(1 - t) > eps) {

View File

@ -23,7 +23,7 @@ vector<Point> Line::toPointVector() const {
Point Line::operator[](int index) const {
return { vX[index], vY[index] };
}
Point Line::getPointByIndex(int index) const {
return operator[](index);
}
@ -61,7 +61,7 @@ Point Line::getEnd() {
}
int Line::direction(bool isY) {
float valueBegin = *vX.begin(), valueEnd = *vX.rbegin();
double valueBegin = *vX.begin(), valueEnd = *vX.rbegin();
if (isY) {
valueBegin = *vY.begin();
valueEnd = *vY.rbegin();

View File

@ -210,7 +210,7 @@ void ShortCutTree::spliteToShortCutTree() {
}
else {
ShortCutNode seTreeNode, swTreeNode;
float xMid = (nowTreeNode.bound.x() + nowTreeNode.bound.z()) / 2;
float xMid = (nowTreeNode.bound.x() + nowTreeNode.bound.z()) / 2+1e-5;
seTreeNode.bound = QVector4D(xMid, nowTreeNode.bound.y(), nowTreeNode.bound.z(), yMid);
isDivided |= handleShortCutNode(nowTreeNode, seTreeNode, segment.first, generatedTreeNodes, sumIncrement);
swTreeNode.bound = QVector4D(nowTreeNode.bound.x(), nowTreeNode.bound.y(), xMid, yMid);

View File

@ -1,7 +1,7 @@
#include "StraightLine.h"
double StraightLine::getLineValueByT(double t, bool isY) {
float valueBegin, valueEnd;
double valueBegin, valueEnd;
if (isY) {
valueBegin = *vY.begin();
valueEnd = *vY.rbegin();
@ -16,11 +16,11 @@ double StraightLine::getLineValueByT(double t, bool isY) {
double StraightLine::findTByValue(double value, bool isY) {
Point pointBegin = getPointByIndex(0), pointEnd = getPointByIndex(1);
if (!isY) {
if(fabs(pointBegin.x - pointEnd.x) <= eps) return 0;
if(fabs(pointBegin.x - pointEnd.x) <= eps) return 0.0;
return (value - pointBegin.x) / (pointEnd.x - pointBegin.x);
}
else {
if (fabs(pointBegin.y - pointEnd.y) <= eps) return 0;
if (fabs(pointBegin.y - pointEnd.y) <= eps) return 0.0;
return (value - pointBegin.y) / (pointEnd.y - pointBegin.y);
}
}
@ -31,10 +31,10 @@ int StraightLine::judgeBoundIntersection(double xy, double l, double r, bool isY
swap(pointBegin.x, pointBegin.y);
swap(pointEnd.x, pointEnd.y);
}
if ((pointBegin.x - xy) * (pointEnd.x - xy) >= eps) return 0;
if ((pointBegin.x - xy) * (pointEnd.x - xy) >= 0) return 0;
if (direction(isY)) {
float t = findTByValue(xy, isY);
float value = getLineValueByT(t, !isY);
double t = findTByValue(xy, isY);
double value = getLineValueByT(t, !isY);
if (l <= value && value <= r && fabs(t) > eps && fabs(1-t) > eps) {
return 1 + direction(isY);
}