I have a trouble in gluperspective method.

I have a trouble in gluperspective method.
I want to implement the gluperspective method, but I failed.
Could you help me? many thanks!
this method has some bugs which I couldn’t find.
_3DPoint _sysPerspective(double fovy,
double aspect,
double zNear, double zFar,
double x,double y,double z)

_3DPoint point;
printf("x=%f y=%f z=%f",x,y,z);

double sine, cotangent, deltaZ;
double radians = fovy / 2 * PI / 180;

deltaZ = zFar - zNear;
sine = sin(radians);
if ((deltaZ == 0) || (sine == 0) || (aspect == 0)) {
return point;
cotangent = cos(radians) / sine;

point.x= (cotangent/aspect)*x/z;
point.y = cotangent*y/z;
point.z = z/deltaZ-zNear/deltaZ;

printf(" ->x=%f y=%f z=%f",x,y,z);
return point;
fovy=60 aspect=800/600 zNear=5 zFar=100
I try to execute the following args.
x=50 y=50 z=50 ->x=1.732051 y=1.732051 z=0.473684
x=100 y=50 z=50 ->x=3.464102 y=1.732051 z=0.473684
x=50 y=100 z=50 ->x=1.732051 y=3.464102 z=0.473684
x=100 y=100 z=50 ->x=3.464102 y=3.464102 z=0.473684
x=50 y=50 z=100 ->x=0.866025 y=0.866025 z=1.000000
x=100 y=50 z=100 ->x=1.732051 y=0.866025 z=1.000000
x=50 y=100 z=100 ->x=0.866025 y=1.732051 z=1.000000
x=100 y=100 z=100 ->x=1.732051 y=1.732051 z=1.000000

x=300 y=300 z=300 ->x=1.732051 y=1.732051 z=3.105263
x=500 y=300 z=300 ->x=2.886751 y=1.732051 z=3.105263
x=300 y=500 z=300 ->x=1.732051 y=2.886751 z=3.105263
x=500 y=500 z=300 ->x=2.886751 y=2.886751 z=3.105263
x=300 y=300 z=500 ->x=1.039230 y=1.039230 z=5.210526
x=500 y=300 z=500 ->x=1.732051 y=1.039230 z=5.210526
x=300 y=500 z=500 ->x=1.039230 y=1.732051 z=5.210526
x=500 y=500 z=500 ->x=1.732051 y=1.732051 z=5.210526
I get the error results. what’s the right results?
how can I modify it?
how can I get the real screen pixel point? which method or ways?

Please, give us a break. We’re not going to debug your math code for you or help you out at all with a post like that.

You don’t even say what specific problems you’re having with it that you’re trying to debug and what you’ve found thus far – you just that it has some bugs and errors.

Go to Mesa3D and look at the source for the function.

First of all, you have wrong comprehension of how perspective works. Actually, it’s nothing more then matrix multiplication and homogenous division. So the best you can do (and what you have to do actually) - is to create perspective matrix (like described in OpenGL specification), then multiply your point (x,y,z,1) by it and divide resulting XYZ by resulting W.