QCAD Bugtracker

  • Status Closed
  • Percent Complete
    100%
  • Task Type Bug Report
  • Category ECMAScript
  • Assigned To
    Andrew
  • Operating System All
  • Severity Very Low
  • Priority Very Low
  • Reported Version 3.28.2
  • Due in Version Undecided
  • Due Date Undecided
  • Votes 1
    • CVH (21.10.2023)
  • Private
Attached to Project: QCAD Bugtracker
Opened by CVH - 15.10.2023
Last edited by Andrew - 17.06.2024

FS#2495 - RLine.isParallel(RLine) may return true for certain non-parallel cases

Andrew,

It took me a while to find the source of a certain freak bug I encountered.
I used the RLine.isParallel(RLine) as a test for knowing if line segments were parallel or not.

Included below is script code that mimics the functionally of isParallel().

As far as I know isParallel() is nowhere used in the QCAD open source.
Textual only found in RLine.cpp & .h or under: opennurbs, ecmaapi\generated and ecmagenerator\src.

// Example:
// RShape1: RLine(RShape(address: "0xcd70e28"), startPoint: "RVector(969.219858, -171.914894, 0.000000, 1)", endPoint: "RVector(1010.000000, -140.000000, 0.000000, 1)")
// RShape2: RLine(RShape(address: "0x7659770"), startPoint: "RVector(969.219858, -171.914894, 0.000000, 1)", endPoint: "RVector(930.000000, -340.000000, 0.000000, 1)")
----
var aShape1Angle = shape1.getAngle();    // =0.6640461628266838 rad
var aShape2Angle = shape2.getAngle();    // =4.483157047107694 rad
----
// RLine::isParallel(RLine) -> aTest1 || aTest2
var aTest1 = RMath.isSameDirection(aShape1Angle, aShape2Angle);              // =false
var aTest2 = RMath.isSameDirection(aShape1Angle, aShape2Angle + Math.PI);    // =true
var aTestOr = aTest1 || aTest2;                                              // =>TRUE !?
----
// # BUG # RShape1 is considered as parallel with RShape2
----
// RMath::isSameDirection(dir1, dir2, tol) ... tol = RS.AngleTolerance = 1e-9
// for aTest1 -> ax1Test1 || ax1Test2
var ax1Dif = Math.abs(aShape1Angle - aShape2Angle);    // =3.8191108842810104 rad
var ax1Test1 = ax1Dif < 1e-9;                          // =false
var ax1Test2 = ax1Dif > 2*Math.PI - 1e-9;              // =false
var ax1TestOr = ax1Test1 || ax1Test2;                  // =>FALSE
----
// for aTest2 -> ax2Test1 || ax2Test2
var ax2Dif = Math.abs(aShape1Angle - (aShape2Angle + Math.PI));    // =6.9607035378708035 rad
var ax2Test1 = ax2Dif < 1e-9;                                      // =false
var ax2Test2 = ax2Dif > 2*Math.PI - 1e-9;                          // =true
var ax1TestOr = ax1Test1 || ax1Test2;                              // =>TRUE
----
// # BUG # The second test of the second isSameDirection() test returns true because ax2Dif is over 2pi

Regards,
CVH

Closed by  Andrew
17.06.2024 09:53
Reason for closing:  Won't fix
CVH commented on 16.10.2023 07:55

I could verify if there is an intersection between the two RLine's.
The question remains at what distance that this is still reasonable valid or not ...

I finally settled for something that is also angle based:

    var aDiff = Math.abs(RMath.getAngleDifference180(shape1.getAngle(), shape2.getAngle()));
    if (RMath.fuzzyAngleCompare(aDiff, 0.0) || RMath.fuzzyAngleCompare(aDiff, Math.PI)) {
    ...
    }

Instead of using:

    if (shape1.isParallel(shape2)) {
    ...
    }

Regards,
CVH

Loading...

Available keyboard shortcuts

Tasklist

Task Details

Task Editing