Re: Points and Vectors in 3D

2011-03-13 Thread Spacen Jasset

On 13/03/2011 00:06, Bekenn wrote:

On 3/12/2011 2:20 PM, Simon wrote:

I've done lots of 3d over the years and used quite a lot of different
libraries and I've come to prefer code that makes a distinction between
points and vectors.


Agreed. This has some nice benefits with operator overloading, as well:

vec v = ...;
pt p = ...;
auto p2 = p + v; // p2 is pt
auto p3 = p + p2; // error
auto v2 = v + v; // v2 is vec

...and with properties:

p.x = 5; // p is pt, sets p._vals[0]
v.dx = 3; // v is vec, sets v._vals[0]
Would you then go on to define things like a cross product as an 
operator overload?


Re: Points and Vectors in 3D

2011-03-13 Thread Simen kjaeraas

Spacen Jasset spacenjas...@yahoo.co.uk wrote:


On 13/03/2011 00:06, Bekenn wrote:

On 3/12/2011 2:20 PM, Simon wrote:

I've done lots of 3d over the years and used quite a lot of different
libraries and I've come to prefer code that makes a distinction between
points and vectors.


Agreed. This has some nice benefits with operator overloading, as well:

vec v = ...;
pt p = ...;
auto p2 = p + v; // p2 is pt
auto p3 = p + p2; // error
auto v2 = v + v; // v2 is vec

...and with properties:

p.x = 5; // p is pt, sets p._vals[0]
v.dx = 3; // v is vec, sets v._vals[0]
Would you then go on to define things like a cross product as an  
operator overload?


Can't see a fitting operator in D. Multiplication (*) is ambiguous at best
and no other operator seems fitting.

I'd like to have more of unicode's mathematical operators and symbols[1]
as operators in D, but currently that's beyond the horizon.

Use cases:

Vector a, b;

auto angle = a ∠ b;
assert( a == (b ∓ .1) );
assert( ( a ∟ b ) == ( angle == degrees( 90 ) ) );
assert( a ∥ b );
auto v = a ⋅ b;


Set c = ∅, d = ∅;

auto union = c ∪ d;
auto intersection = c ∩ d;

assert( foo ∈ c );
assert( foo ∉ d );
assert( d ∌ foo );
assert( c ∋ foo );

assert( d ⊂ c );
assert( d ⊅ c );

assert( ∏[1,2,3] == ∑[1,2,3] );

Of course, this requires a method for typing these symbols, something
which TeX has already solved for us.


[1]:  
http://en.wikipedia.org/wiki/Mathematical_operators_and_symbols_in_Unicode


--
Simen


Re: Points and Vectors in 3D

2011-03-13 Thread Simon

On 13/03/2011 14:11, Simen kjaeraas wrote:

Spacen Jasset spacenjas...@yahoo.co.uk wrote:


On 13/03/2011 00:06, Bekenn wrote:

On 3/12/2011 2:20 PM, Simon wrote:

I've done lots of 3d over the years and used quite a lot of different
libraries and I've come to prefer code that makes a distinction between
points and vectors.


Agreed. This has some nice benefits with operator overloading, as well:

vec v = ...;
pt p = ...;
auto p2 = p + v; // p2 is pt
auto p3 = p + p2; // error
auto v2 = v + v; // v2 is vec

...and with properties:

p.x = 5; // p is pt, sets p._vals[0]
v.dx = 3; // v is vec, sets v._vals[0]

Would you then go on to define things like a cross product as an
operator overload?


Can't see a fitting operator in D. Multiplication (*) is ambiguous at best
and no other operator seems fitting.



Convention is to use ^ as cross product and * as dot product.

--
My enormous talent is exceeded only by my outrageous laziness.
http://www.ssTk.co.uk


Re: Points and Vectors in 3D

2011-03-13 Thread Simen kjaeraas

On Sun, 13 Mar 2011 15:43:09 +0100, Simon s.d.hamm...@gmail.com wrote:


On 13/03/2011 14:11, Simen kjaeraas wrote:

Spacen Jasset spacenjas...@yahoo.co.uk wrote:


On 13/03/2011 00:06, Bekenn wrote:

On 3/12/2011 2:20 PM, Simon wrote:

I've done lots of 3d over the years and used quite a lot of different
libraries and I've come to prefer code that makes a distinction  
between

points and vectors.


Agreed. This has some nice benefits with operator overloading, as  
well:


vec v = ...;
pt p = ...;
auto p2 = p + v; // p2 is pt
auto p3 = p + p2; // error
auto v2 = v + v; // v2 is vec

...and with properties:

p.x = 5; // p is pt, sets p._vals[0]
v.dx = 3; // v is vec, sets v._vals[0]

Would you then go on to define things like a cross product as an
operator overload?


Can't see a fitting operator in D. Multiplication (*) is ambiguous at  
best

and no other operator seems fitting.



Convention is to use ^ as cross product and * as dot product.


Really? I've never heard of it. Rather, everyone I've talked to about it
has said exactly what I did.

--
Simen


Re: Points and Vectors in 3D

2011-03-13 Thread Caligo
On Sun, Mar 13, 2011 at 9:11 AM, Simen kjaeraas simen.kja...@gmail.comwrote:

 Spacen Jasset spacenjas...@yahoo.co.uk wrote:

 Can't see a fitting operator in D. Multiplication (*) is ambiguous at best
 and no other operator seems fitting.


I agree.  It's just better do define 'dot' and 'cross'.  That's how it's
done in Eigen and it works great.


Re: Points and Vectors in 3D

2011-03-13 Thread Simon

On 13/03/2011 15:29, Simen kjaeraas wrote:

On Sun, 13 Mar 2011 15:43:09 +0100, Simon s.d.hamm...@gmail.com wrote:


Convention is to use ^ as cross product and * as dot product.


Really? I've never heard of it. Rather, everyone I've talked to about it
has said exactly what I did.



Openscenegraph uses those conventions and I've seen it used elsewhere as 
well. Not sure where they originated though.


Seeing as dot  cross product are very common, having them as operators 
is really handy.


--
My enormous talent is exceeded only by my outrageous laziness.
http://www.ssTk.co.uk


Points and Vectors in 3D

2011-03-12 Thread Caligo
Given everything that D offers, what would be the best way to implement a
Point and a Vector type?  The same (x, y, z) can be used to represent
vectors, but a point represents a position, whereas a vector represents a
direction.  So, would you define two different structs for each? or define
and implement an interface?  a fixed array or POD members?


Re: Points and Vectors in 3D

2011-03-12 Thread Simon

On 12/03/2011 20:51, Caligo wrote:

Given everything that D offers, what would be the best way to implement
a Point and a Vector type?  The same (x, y, z) can be used to represent
vectors, but a point represents a position, whereas a vector represents
a direction.  So, would you define two different structs for each? or
define and implement an interface?  a fixed array or POD members?


I've done lots of 3d over the years and used quite a lot of different 
libraries and I've come to prefer code that makes a distinction between 
points and vectors. Makes code easier to read and more type safe, though 
it's a bit more inconvenient when you need to mix things up.


I use:

struct pt {
  float[3] _vals;
}

struct vec {
  float[3] _vals;
}

Using the float[3] allows you to use vector ops:

pt  p0;
vec v;

p0._vals[] += v._vals[];

You don't want an interface; you don't get anything more value type than 
points  vectors. In a modern 3d models you could be dealing with a 1/2 
million vertices.


--
My enormous talent is exceeded only by my outrageous laziness.
http://www.ssTk.co.uk


Re: Points and Vectors in 3D

2011-03-12 Thread Bekenn

On 3/12/2011 2:20 PM, Simon wrote:

I've done lots of 3d over the years and used quite a lot of different
libraries and I've come to prefer code that makes a distinction between
points and vectors.


Agreed.  This has some nice benefits with operator overloading, as well:

vec v = ...;
pt p = ...;
auto p2 = p + v;// p2 is pt
auto p3 = p + p2;   // error
auto v2 = v + v;// v2 is vec

...and with properties:

p.x = 5;// p is pt, sets p._vals[0]
v.dx = 3;   // v is vec, sets v._vals[0]