Tri.c - c
Embed
You can embed this paste into a blog or website with this code:
<iframe class="codetidy" type="text/html" width="100%" src="http://codetidy.com/paste/embed/171" frameborder="0"></iframe>
typedef struct {
float x
;
float y
;
float z
;
} Vector3
;
typedef struct {
Vector3 a
;
Vector3 b
;
Vector3 c
;
} Triangle
;
typedef struct {
Vector3 p
;
Vector3 normal
;
} Plane
;
// Dot product of two vectors
float dot
(Vector3
*v1
, Vector3
*v2
) {
return v1
->x
* v2
->x
+ v1
->y
* v2
->y
+ v1
->z
* v2
->z
; 
}
// Magnitude of a vector
float vectorMagnitude
(Vector3
*v
) {
return sqrt(v
->x
* v
->x
+ v
->y
* v
->y
+ v
->z
* v
->z
);
}
// Normalized version of a vector
Vector3 normalizedVector
(Vector3
*v
) {
float mag
= vectorMagnitude
(v
);
Vector3 result
= { v
->x
/mag
, v
->y
/mag
, v
->z
/mag
};
return result
;
}
// Multiply a vector by a float
Vector3 vectorMult
(Vector3
*v
, float f
) {
Vector3 result
= { v
->x
*f
, v
->y
*f
, v
->z
*f
};
return result
;
}
// Subtract v2 from v1
Vector3 vectorSubtr
(Vector3
*v1
, Vector3
*v2
) {
Vector3 result
= { v1
->x
-v2
->x
, v1
->y
-v2
->y
, v1
->z
-v2
->z
};
return result
;
}
// Add a vector to another vector
Vector3 vectorAdd
(Vector3
*v
, Vector3
*p
) {
Vector3 result
= { v
->x
+p
->x
, v
->y
+p
->y
, v
->z
+p
->z
};
return result
;
}
// Finds the point on a plane nearest the origin
Vector3 pointNearestOrigin
(Plane
*plane
) {
float d
= dot
(&(plane
->normal
), &(plane
->p
));
Vector3 norm
= normalizedVector
(&(plane
->normal
));
Vector3 result
= vectorMult
(&norm
, d
);
return result
;
}
// Project a vector in space onto a plane that intersects the origin.
Vector3 projectPointOnPlane
(Vector3
*point
, Plane
*plane
) {
Vector3 n
= normalizedVector
(&(plane
->normal
));
Vector3 u
= vectorMult
(&n
, dot
(point
, &n
));
Vector3 projected
= vectorSubtr
(point
, &u
);
projected
= vectorAdd
(&projected
, &(plane
->p
));
return projected
;
}
// Project a triangle onto a plane that intersects the origin.
Triangle projectOnPlane
( Triangle
*t
, Plane
*p
) {
// for each point in the triangle we need to generate a vector to 
// that point and project the vector onto the plane. The three 
// resulting vectors point to the projected triangle points.
Vector3 a
= projectPointOnPlane
(&(t
->a
), p
);
Vector3 b
= projectPointOnPlane
(&(t
->b
), p
);
Vector3 c
= projectPointOnPlane
(&(t
->c
), p
);
Vector3 displacement
= pointNearestOrigin
(p
);
Triangle result
= { vectorAdd
(&a
, &displacement
), vectorAdd
(&b
, &displacement
), vectorAdd
(&c
, &displacement
) }; 
return result
;
}
int main
(int argc
, char** argv
) {
Vector3 planePoint
= { -1.0, -1.0, -1.0 };
Vector3 planeNormal
= { 0.1, 0.1, 0.1 };
Plane plane
= { planePoint
, planeNormal
};
Vector3 p1
= { -2.0, 1.0, 1.0 };
Vector3 p2
= { 2.0, 1.0, 3.0 };
Vector3 p3
= { 6.0, 1.0, 4.0 };
Triangle triangle
= { p1
, p2
, p3
};
Triangle projectedT
= projectOnPlane
(&triangle
, &plane
);
printf("(%f,%f,%f)\n(%f,%f,%f)\n(%f,%f,%f)\n", projectedT.
a.
x, projectedT.
a.
y, projectedT.
a.
z,
projectedT.
b.
x, projectedT.
b.
y, projectedT.
b.
z,
projectedT.
c.
x, projectedT.
c.
y, projectedT.
c.
z);
return 0;
}