| further reading | more topics » |
| mjbWorld program | 3D theory |
3D physics |
3D maths |
3D programming | technology |
about site |
sitemap A-Z |
| index | algebra | geometry | calculus | graph theory | statistics | principles | standards |
| index | equations | multi-dim | vector | matrix | complex | clifford | groups |
| index | applications | related | angle between | look at | code |
/*Title: mjbWorld
Copyright (c) 1998-2007 Martin John Baker This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General public: License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General public: License for more details.For information about the GNU General public: License see http://www.gnu.org/To discuss this program http://sourceforge.net/forum/forum.php?forum_id=122133
also see website http://www.euclideanspace.com/
*//*
for theory see:
http://www.euclideanspace.com/maths/vectors/index.htm
*/__gc class sfvec3f : public property {
public: static bool saveAsDouble = false ;
public: double x;
public: double y;
public: double z; // VRML only supports float but allow override if higher resolution required public: sfvec3f(double x,double y,double z); public: sfvec3f(sfvec3f* in); public: sfvec3f(); public: void sub(sfvec3f* other);
public: void add(sfvec3f* other);
public: void normalize();
public: void scale(double sc);
public: double distanceSquared(sfvec3f* other);
void cross(sfvec3f* other);
double dot(sfvec3f* other); static sfvec3f* sub(sfvec3f* a,sfvec3f* b){
return new sfvec3f(a->x - b->x,a->y - b->y,a->z - b->z);
} public: String* vrmlType(); public: static String* vrmlType_s(){
return "SFVec3f";
} public: String* ToString(); public: property* clone(); /** create an array of the appropriate type
* with a size given by the parameter
*/
public: property* createArray(int size)[]; public: void setX(double v); public: void setY(double v); public: void setZ(double v); public: double getx(); public: double gety(); public: double getz(); public: sfvec3f* minus(); public: String* toStatic(); /* if i=0 take minimum otherwise maximum */
public: void combine(sfvec3f* bb_current,int i); public: bool greaterThan(sfvec3f* other); public: bool lessThan(sfvec3f* other);
public: bool Equals(sfvec3f* v2);
/** output as a string
* mode values
* 0 - output modified values
* 1 - output original values
* 2 - output attribute
* 3 - output attribute in brackets
* 4 - output with f prefix
*/
public: String* outstring(int format);/** write to file
* filter = information about output
* mode values
* 0 - output VRML97 modified values
* 1 - output VRML97 original values
* 2 - output xml (x3d)
* 3 - output attribute in brackets
* 4 - output with f prefix
*/
public: void write(filter* f,int mode,int indent); public: bool readX3d(filter* f); /** used by mfparam.vrml2par
*/
public: bool instring(filter* f,sfparam* sfp,nodeBean* n,int mode) ; /** used by mfvec3f.instring
*/
public: bool instring(filter* f,String* s1); public: static Type* getEditClass(){
return __typeof(sfvec3fEditor);
}
};
/*Title: mjbWorld
Copyright (c) 1998-2002 Martin John BakerThis program is free software; you can redistribute it and/or
modify it under the terms of the GNU General License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General License for more details.For information about the GNU General License see http://www.gnu.org/To discuss this program http://sourceforge.net/forum/forum.php?forum_id=122133
also see website http://www.euclideanspace.com/
*//*
for theory see:
http://www.euclideanspace.com/maths/vectors/index.htm
*/#include "mjbModel.h"
/* x3d definition<!ENTITY % SFVec3f "CDATA"> <!-- ArrayList3Float -->
*/
//private sfvec3fEditor editor = null; // VRML only supports float but allow override if higher resolution requiredsfvec3f::sfvec3f(double x1,double y1,double z1) {
x=x1;
y=y1;
z=z1;
saveAsDouble = false ;
}sfvec3f::sfvec3f(sfvec3f* in) { // copy constructor
x=(in) ? in->x : 0;
y= (in) ? in->y : 0;
z= (in) ? in->z : 1;
saveAsDouble = false ;
}sfvec3f::sfvec3f() {
saveAsDouble = false ;
}String* sfvec3f::vrmlType(){
return "SFVec3f";
}property* sfvec3f::clone() {
//Console::WriteLine("sfvec3f->clone");
return new sfvec3f(this);
}/*
for theory see:
http://www.euclideanspace.com/maths/vectors/index.htm
*/
void sfvec3f::sub(sfvec3f* other){
x-= other->x;
y-= other->y;
z-= other->z;
}/*
for theory see:
http://www.euclideanspace.com/maths/vectors/index.htm
*/
void sfvec3f::add(sfvec3f* other){
x+= other->x;
y+= other->y;
z+= other->z;
}/*
for theory see:
http://www.euclideanspace.com/maths/vectors/normals/index.htm
*/
void sfvec3f::normalize(){
double t = Math::Sqrt(x*x + y*y + z*z);
x /= t;
y /= t;
z /= t;
}void sfvec3f::scale(double sc){
x *= sc;
y *= sc;
z *= sc;
}
double sfvec3f::distanceSquared(sfvec3f* other){
double x1 = other->x - x;
double y1 = other->y - y;
double z1 = other->z - z;
return x1*x1 + y1*y1 + z1*z1;
}void sfvec3f::cross(sfvec3f* other) {
double xh = y * other->z - other->y * z;
double yh = z * other->x - other->z * x;
double zh = x * other->y - other->x * y;
x = xh;
y = yh;
z = zh;
}double sfvec3f::dot(sfvec3f* other) {
return (x * other->x) + (y * other->y) + (z * other->z);
}/** create an array of the appropriate type
* with a size given by the parameter
*/
property* sfvec3f::createArray(int size)[]{
return new sfvec3f*[size];
}void sfvec3f::setX(double v) {
x=v;
}void sfvec3f::setY(double v) {
y=v;
}void sfvec3f::setZ(double v) {
z=v;
}double sfvec3f::getx() {
return x;
}double sfvec3f::gety() {
return y;
}double sfvec3f::getz() {
return z;
}sfvec3f* sfvec3f::minus() {
return new sfvec3f(-x,-y,-z);
}String* sfvec3f::toStatic() {
return String::Concat(__box(x)->ToString(),S"f,",
__box(y)->ToString(),S"f,",
__box(z)->ToString(),S"f");
}String* sfvec3f::ToString() {
return String::Concat(S"(",__box(x)->ToString(),S",",
__box(y)->ToString(),S",",
__box(z)->ToString(),S")");
}bool sfvec3f::greaterThan(sfvec3f* other) {
if (other->x > x) return true;
if (other->y > y) return true;
if (other->z > z) return true;
return false;
}bool sfvec3f::lessThan(sfvec3f* other) {
if (other->x < x) return true;
if (other->y < y) return true;
if (other->z < z) return true;
return false;
}bool sfvec3f::Equals(sfvec3f* v2) {
if (!v2) return false;
if (x!= v2->x) return false;
if (y!= v2->y) return false;
if (z!= v2->z) return false;
return true;
}/** use to combine bounds
* if i=0 take minimum otherwise maximum */
void sfvec3f::combine(sfvec3f* other,int i){
if (i==0) { // take minimum
if (other->x < x) x=other->x;
if (other->y < y) y=other->y;
if (other->z < z) z=other->z;
} else { // take maximum
if (other->x > x) x=other->x;
if (other->y > y) y=other->y;
if (other->z > z) z=other->z;
}
}/** output as a string
* mode values
* 0 - output modified values
* 1 - output original values
* 2 - output attribute
* 3 - output attribute in brackets
* 4 - output with f prefix
*/
String* sfvec3f::outstring(int format) {
if (format == 3) {
if (saveAsDouble)
return String::Concat(S"(",__box(x)->ToString(),S" ",
__box(y)->ToString(),S" ",
__box(z)->ToString(),S")");
else
return String::Concat(S"(",__box((float)x)->ToString(),S" ",
__box((float)y)->ToString(),S" ",
__box((float)z)->ToString(),S")");
} else if (format == 4) {
return String::Concat(__box((float)x)->ToString(),S"f,",
__box((float)y)->ToString() , S"f," ,
__box((float)z)->ToString() , S"f");
} else {
if (saveAsDouble)
return String::Concat(__box(x)->ToString(),S" ",
__box(y)->ToString(),S" ",
__box(z)->ToString());
else
return String::Concat(__box((float)x)->ToString(),S" ",
__box((float)y)->ToString(),S" ",
__box((float)z)->ToString());
}
}/** write to file
* filter = information about output
* mode values
* 0 - output VRML97 modified values
* 1 - output VRML97 original values
* 2 - output xml (x3d)
* 3 - output attribute in brackets
* 4 - output with f prefix
*/
void sfvec3f::write(filter* f,int mode,int indent){
if (mode == 3) {
if (saveAsDouble) {
f->write(String::Concat(S"(",__box(x)->ToString(),S" ",
__box(y)->ToString(),S" ",
__box(z)->ToString(),S")"));
return;
} else {
f->write(String::Concat(S"(",__box((float)x)->ToString(),S" ",
__box((float)y)->ToString(),S" ",
__box((float)z)->ToString(),S")"));
return;
}
} else if (mode == 4) {
f->write(String::Concat(__box(x)->ToString(),S"f,",
__box(y)->ToString(),S"f,",
__box(z)->ToString(),S"f"));
return;
} else {
if (saveAsDouble) {
f->write(String::Concat(__box(x)->ToString(),S" ",
__box(y)->ToString(),S" ",
__box(z)->ToString()));
return;
} else
f->write(String::Concat(__box((float)x)->ToString(),S" ",
__box((float)y)->ToString(),S" ",
__box((float)z)->ToString()));
}
// f->write(outstring(mode));
}bool sfvec3f::readX3d(filter* f) {
String* s;
s=f->nextToken();
if (s->Equals("=")) {
s=f->nextToken();
if (s->Equals("'")) {
s=f->nextToken();
if (s->Equals("(")) {
s=f->nextToken();
}
}
}
x = Single::Parse(s);
s=f->nextToken();
y = Single::Parse(s);
s=f->nextToken();
z = Single::Parse(s);
return true;
}/** used by mfparam->vrml2par
*/
bool sfvec3f::instring(filter* f,sfparam* sfp,nodeBean* n,int mode) {
String* s;
s=f->nextToken();
if (s) if (s->Equals("IS")) {
s=f->nextToken();
if (sfp) sfp->setIs(s);
return true;
}
x = Single::Parse(s);
s=f->nextToken();
y = Single::Parse(s);
s=f->nextToken();
z = Single::Parse(s);
return true;
}/** used by mfvec3f->instring
*/
bool sfvec3f::instring(filter* f,String* s1) {
String* s;
x = Single::Parse(s1);
s=f->nextToken();
y = Single::Parse(s);
s=f->nextToken();
z = Single::Parse(s);
return true;
}
|
metadata block |
|
| see also: |
|
| Correspondence about this page | |
|
Book Shop - Further reading. Where I can, I have put links to Amazon for books that are relevant to the subject, click on the appropriate country flag to get more details of the book or to buy it from them. |
|
|
Commercial Software Shop Where I can, I have put links to Amazon for commercial software, not directly related to the software project, but related to the subject being discussed, click on the appropriate country flag to get more details of the software or to buy it from them. |
|
Can you help? Please send me any improvements to here. I would appreciate ideas to make the pages more useful including error correction, ideas for new pages, improvements to wording. It helps if you quote the full URL of the page. |
|
|
Terminology and Notation Specific to this page here: |
|
|
program I am working on a project which uses these principles, if you would like to help me with this you are welcome to join in, here: |
|
This site may have errors. Don't use for critical systems.
Copyright (c) 1998-2008 Martin John Baker - All rights reserved - privacy policy.