@Test
  public void equals_planeNorm() {

    for (int i = 0; i < 100; i++) {
      PlaneNormal3D_F64 a =
          new PlaneNormal3D_F64(
              (double) rand.nextGaussian(),
              (double) rand.nextGaussian(),
              (double) rand.nextGaussian(),
              (double) rand.nextGaussian(),
              (double) rand.nextGaussian(),
              (double) rand.nextGaussian());
      PlaneNormal3D_F64 b = new PlaneNormal3D_F64(a);

      b.p.x += (rand.nextDouble() - 0.5) * GrlConstants.DOUBLE_TEST_TOL;
      b.p.y += (rand.nextDouble() - 0.5) * GrlConstants.DOUBLE_TEST_TOL;
      b.p.z += (rand.nextDouble() - 0.5) * GrlConstants.DOUBLE_TEST_TOL;
      b.n.x += (rand.nextDouble() - 0.5) * GrlConstants.DOUBLE_TEST_TOL;
      b.n.y += (rand.nextDouble() - 0.5) * GrlConstants.DOUBLE_TEST_TOL;
      b.n.z += (rand.nextDouble() - 0.5) * GrlConstants.DOUBLE_TEST_TOL;

      // change scaling
      double scale = rand.nextGaussian() * 2;
      b.n.x *= scale;
      b.n.y *= scale;
      b.n.z *= scale;

      assertTrue(UtilPlane3D_F64.equals(a, b, GrlConstants.DOUBLE_TEST_TOL * 50));

      b.p.x += (rand.nextDouble() - 0.5);
      b.p.y += (rand.nextDouble() - 0.5);
      b.p.z += (rand.nextDouble() - 0.5);
      b.n.x += (rand.nextDouble() - 0.5);
      b.n.y += (rand.nextDouble() - 0.5);
      b.n.z += (rand.nextDouble() - 0.5);

      assertFalse(UtilPlane3D_F64.equals(a, b, GrlConstants.DOUBLE_TEST_TOL * 50));
    }
  }