Re: G3DLine -intersectsLine:
Philippe C.D. Robert <[email protected]> Wed, 23 Oct 2002 13:04:58 +0200
| Newsgroups | gmane.comp.gnu.3dkit.general |
|---|---|
| Message-ID | <[email protected]> |
On Monday, October 21, 2002, at 10:20 Uhr, Brent Gulanowski wrote:
> On Monday, October 21, 2002, at 02:08 PM, Brent Gulanowski wrote:
>
>> This method does a blanket failure if the direction vectors are
>> parallel. I am not a geometry math whiz, but as far as I can tell,
>> this ignores the case where the lines are coincident.
>
> I've been looking more closely at this class, and I have some
> suggestions.
>
> By having a factor ivar (_t), we are in fact defining a line segment,
> not a line. In which case, I don't understand the decision to describe
> the object using the origin/vector approach. Really, a line and a line
> segment are two different things. I wonder if we should make this a
> true line and remove the factor. IMHO, a line segment is best
> described as origin/endpoint -- I'm not sure whether such a simple
> object needs a class definition or not.
It is true, the current G3DLine implementation is kind of a hybrid -
and therefor does not have a clean API either. I was thinking of
splitting it into a G3DRay (origin + direction) and a G3DLine (start pt
+ end pt) class.
> If we make the line class more generalized, I also recommend
> standardizing it further by making the origin point the point on the
> line which is closest to the origin of the coordinate system. This
> could be done with a no side effects method (return a new,
> standardized line). Suggested implementation provided.
Why would you need this? Do you have a real world scenario in mind?
> I'd appreciate if you could check my code, btw. It depends on the
> fact that the direction vector is normalized when producing the
> distance along the line to the new origin (calculated with
> G3DScalarProduct3fv).
>
> -(G3DLine *) standardize {
>
> // nearestP = knownP + [knownP . directionVec]*directionVec ... use
> origin for knownP
>
> G3DTuple3f nearestP;
> float temp[3];
>
> G3DScaleVector3fv( temp, [direction elements], G3DScalarProduct3fv(
> [origin elements], [direction elements] ) );
> G3DVectorAdd3fv( temp, [origin elements], temp );
> nearestP = [[G3DTuple3f alloc] initWithElements:temp];
>
> // OK, this is where I freak out from not having autorelease. What
> is GNUstep doing in these cases?
> // This is being returned with a ref count of 1, and so violates the
> Cocoa standard
>
> return [[G3DLine alloc] initWithOrigin:nearestP direction:direction
> factor: _t];
>
> }
>
> Note: if you like my other idea (dump the factor ivar), the last line
> would look like:
>
> return [[G3DLine alloc] initWithOrigin:nearestP direction:direction];
>
> because we'd have to change the relevant init method.
I guess the API will change anyway if we are going to have a ray and a
line (segment) class. BTW the naming in the GK is like
- (void)process;
// performs the operation in place
- (AnObject *)processedObject;
// returns an autoreleased object which has been processed
I will have a look at all it this evening, if I can find some time.
-Phil
--
Philippe C.D. Robert
http://www.nice.ch/~phip