Login
Username:

Password:

Remember me



Lost Password?

Register now!
Main Menu
Who's Online
33 user(s) are online (8 user(s) are browsing Forum)

Members: 0
Guests: 33

more...
Top Posters

Browsing this Thread:   1 Anonymous Users





Need help with some code.
Home away from home
Joined:
2004/4/12 5:20
From Perth,Australia
Group:
Registered Users
Posts: 525
Offline
I adapted this routine from some code on a newsgroup..It is supposed to generate points on the surface of a sphere. At the moment it only generates 'Access Violation' errors

I can get it to run by setting the variable a=1,this generates the point coords(very fast too) but not correctly,They are all crowded on one side in lines.

I'm no good at maths so can anyone see where the problem is.
thankls for any help.

heres the code
// some setup stuff
type
vectorfloat = record
x, y, z: double;
end;

var
points : aray of vectorfloat;

setlength(points,100);

// generate the 3d points
procedure GenerateDotBall2(var Points: array of Vectorfloat);
var
n, i, j, m, count: integer;
beta, a, r, z, x, y, alpha: double;
begin
n := length(points);
if n < 1 then exit;
// subdivision angle
beta := 0.5 * pi / n;
// line segment length
a := 2 * sin(beta / 2);
//a := 1;
// endcap
count := 0;
Points[count].x := 0;
Points[count].y := 0;
Points[count].z := 1;
inc(count);
Points[count].x := 0;
Points[count].y := 0;
Points[count].z := -1;
inc(count);

// rings
for i := 1 to n do
begin
r := sin(i * beta);
z := cos(i * beta);
m := round(R * 2 * pi / a);
for j := 0 to m - 1 do
begin
alpha := j / m * 2 * pi;
x := cos(alpha) * r;
y := sin(alpha) * r;
Points[count].x := x;
Points[count].y := y;
Points[count].z := z;
if i <> N then
begin
Points[count].x := x;
Points[count].y := y;
Points[count].z := -z;
end;
inc(count);
end;
end;

end;

Hers the original algorithm from comp.graphics.algorithm
N := StrToIntDef(InputBox('Number of parts (N >= 1)', 'N = ', '1'), 0);
if N < 1 then exit;
// subdivision angle
Beta := 0.5 * pi / N;
// line segment length
A := 2 * sin(beta/2);
// endcap
AddPoint(0, 0, 1);
AddPoint(0, 0, -1);
// rings
for i := 1 to N do begin
R := sin(i * beta);
Z := cos(i * beta);
M := round(R * 2 * pi / A);
for j := 0 to M - 1 do begin
Alpha := j/M * 2 * pi;
X := cos(Alpha) * R;
Y := sin(Alpha) * R;
AddPoint(X, Y, Z);
if i <> N then
AddPoint(X, Y, -Z);
end;
end;

Posted on: 2005/10/8 6:53
_________________
Imagine 2.19 ......
Transfer the post to other applications Transfer


Re: Need help with some code.
Home away from home
Joined:
2004/4/12 5:20
From Perth,Australia
Group:
Registered Users
Posts: 525
Offline
just realised the n variable is not a point count..set n=1 and it runs for 6 points then a 'floating point error' exception ???
n=2 for 16 points then the same error. getting a headache now

Posted on: 2005/10/8 7:35
_________________
Imagine 2.19 ......
Transfer the post to other applications Transfer


Re: Need help with some code.
Webmaster
Joined:
2004/4/3 15:57
From Stockholm, Sweden.
Group:
Webmasters
Registered Users
Posts: 2455
Offline
Running through your code I have the following comments...

begin
  n 
:= length(points);

What does N has to to with the points?
It seems more to me to mean how many subdivisions you have of the sphere, not the amount of points on it.

if 1 then exit;
  
// subdivision angle
  
beta := 0.5 pi n;

Above they calculated the angle between the subdivisions (rings) of the sphere, but this means for one hemisphere only.

Below they calculate the length of each segment, a
or the distance betweens the points (vertices) if you want.

// line segment length
  
:= sin(beta 2);
  
//a := 1;

Below you add the polar cap points...

// endcap
  
count := 0;
  
Points[count].:= 0
  
Points[count].:= 0;
  
Points[count].:= 1;
  
inc(count);
  
Points[count].:= 0
  
Points[count].:= 0;
  
Points[count].:= -1;
  
inc(count);

Here you start by going through each subdivision (ring) to add the points around it...

// rings
  
for := 1 to n  do
  
begin

First they get the radius for the ring of the angle and then the height on the hemisphere.

:= sin(beta);
    
:= cos(beta);

Then the code is supposed to calculate how many points of the length you need around the ring, but to me it looks like the variable/constant R is undefined, but maybe this language r and R is the same, otherwise this might be your problem., in any way, its ment to give a number of points around the circle based on the calculated line segment length a above.

:= round(pi a);

The program is then supposed to step through these points and adding them to the vector...

for := 0 to m do
    
begin
      alpha 
:= pi;
      
:= cos(alpha) * r;
      
:= sin(alpha) * r;

This adds the north hemisphere point...

Points
[count].:= x;
      
Points[count].:= y;
      
Points[count].:= z;

Again we use an undefined variable N (you probably mean n) but I dont know if they are the same in this language, same as R above might be the same as r...

In anycase this adds the south hemispshere half of the same coordinate... this means you probably should make an inc on each of those too, if i shoudl be equalt to N i.e. the equator, then we dont need to add it two times.

if <> N then
      begin
        Points
[count].:= x;
        
Points[count].:= y;
        
Points[count].:= -z;
      
end;
      
inc(count);
    
end;
  
end;
end;

Not sure if this helps, but the code below seems to be right , just not sure if your code is doing what the pseudocode below is doing

Hers the original algorithm from comp
.graphics.algorithm
 N 
:= StrToIntDef(InputBox('Number of parts (N >= 1)''N = ''1'), 0);
  if 
1 then exit;
  
// subdivision angle
  
Beta := 0.5 pi N;
  
// line segment length
  
:= sin(beta/2);
  
// endcap
  
AddPoint(001);
  
AddPoint(00, -1);
  
// rings
  
for := 1 to N do begin
    R 
:= sin(beta);
    
:= cos(beta);
    
:= round(pi A);
    for 
:= 0 to M do begin
      Alpha 
:= j/pi;
      
:= cos(Alpha) * R;
      
:= sin(Alpha) * R;
      
AddPoint(XYZ);
      if 
<> N then
        AddPoint
(XY, -Z);
    
end;
  
end;

Well, as I havent coded in pascal for quite some time I dont remeber if N=n in variable terms But I hope I might have pointet something out anyway.
For the errors I would check the array indexing and check all divisions in a debugger or with simple printouts of the values while running with known values of N
Thats probably the easiest way to find the errors.

Posted on: 2005/10/8 10:24
_________________
Johan Andersson the Impulsive Imagineer
IFW 2.19..................
Transfer the post to other applications Transfer


Re: Need help with some code.
Home away from home
Joined:
2004/4/12 5:20
From Perth,Australia
Group:
Registered Users
Posts: 525
Offline
thanks! thats made the code a lot clearer to me. FYI n=N in pascal/delphi..case does not matter in variable names.

Posted on: 2005/10/8 10:44
_________________
Imagine 2.19 ......
Transfer the post to other applications Transfer


Re: Need help with some code.
Just can't stay away
Joined:
2004/8/16 9:53
From Germany
Group:
Registered Users
Posts: 130
Offline
I found 2 errors in your code and one in the original:

with
Points[count].x := x;
Points[count].y := y;
Points[count].z := z;
if i <> N then
begin
Points[count].x := x;
Points[count].y := y;
Points[count].z := -z;
you write overwrite the first cordinates (north) with the cordinates of the south. This appears, because the o-code printet points directly to the display (so it looks like to me). The secound errror is, why should the last points of the south not written to the field but the north (same error in the original code). Another remark is: did you use one begin and end too much in the last section ?

@ Johan
N is not a undefined variable, it sets the number of segments in horizontal and vertical alignment.

Posted on: 2005/10/8 11:03
_________________
Imagine for Windows 2.0

You know you have been raytraced too long when...
... You wonder which raytracer God used. (David Kraics)

Mike......
Transfer the post to other applications Transfer


Re: Need help with some code.
Webmaster
Joined:
2004/4/3 15:57
From Stockholm, Sweden.
Group:
Webmasters
Registered Users
Posts: 2455
Offline
Quote:

mikel wrote:

@ Johan
N is not a undefined variable, it sets the number of segments in horizontal and vertical alignment.


If N <> n then it would have been undefined just like R, but as liontamer wrote, pascal/delphi is caseindependant on variables and as such both were defined.

Being at base a C programmer I thought this might be the case but was still asking

The fault you point out is the same as I do, however, in the pseudocode they assume AddPoint automatically build or adds to the vector array, something liontamers code didnt

He has exactly the right amount of begins and ends

Posted on: 2005/10/8 15:21
_________________
Johan Andersson the Impulsive Imagineer
IFW 2.19..................
Transfer the post to other applications Transfer


Re: Need help with some code.
Home away from home
Joined:
2004/4/12 5:20
From Perth,Australia
Group:
Registered Users
Posts: 525
Offline
thanks guys, its working better now..I didn't realise that the number of points was set within the routine and was calling it with a too small array,hence the av's..I get a complete sphere but there is still a floating point error generated at the end of the loops for some reason but i think i can fix it.


ok. works perfectly now..its fast but somewhat limited in how many points it generates. eg values for n..
n=1..6 points
n=2..22 points
n=3..48 points
n=4..82 points
n=5..128 points
n=6..184 points
n=7..248 points
n=8..328 points
n=9..412 points
n=10..510 points.
I cant see a pattern there..anybody?

Posted on: 2005/10/8 21:30

Edited by liontamer on 2005/10/9 2:19:16
_________________
Imagine 2.19 ......
Transfer the post to other applications Transfer


Re: Need help with some code.
Just can't stay away
Joined:
2004/8/16 9:53
From Germany
Group:
Registered Users
Posts: 130
Offline
Yes and no. The var M differs a little bit from the round function. So the pattern is not linear.

n=1..6 points +6
n=2..22 points +16
n=3..48 points +26
n=4..82 points +34
n=5..128 points +46
n=6..184 points +56
n=7..248 points +64
n=8..328 points +80
n=9..412 points +84
n=10..510 points. +98

so number of points should be <=n*10.

Mike

Posted on: 2005/10/9 8:36
_________________
Imagine for Windows 2.0

You know you have been raytraced too long when...
... You wonder which raytracer God used. (David Kraics)

Mike......
Transfer the post to other applications Transfer


Re: Need help with some code.
Webmaster
Joined:
2004/4/3 15:57
From Stockholm, Sweden.
Group:
Webmasters
Registered Users
Posts: 2455
Offline
Thats because it rounds it up, since it tries to put all points on an equal distance from each other...
Just make the array big enough, runt through the calculation on number of points BEFORE you allocate the array and you will be fine.

Posted on: 2005/10/9 11:58
_________________
Johan Andersson the Impulsive Imagineer
IFW 2.19..................
Transfer the post to other applications Transfer






You can view topic.
You cannot start a new topic.
You cannot reply to posts.
You cannot edit your posts.
You cannot delete your posts.
You cannot add new polls.
You cannot vote in polls.
You cannot attach files to posts.
You cannot post without approval.

[Advanced Search]


Search
Powered by XOOPS © 2001-2009 The XOOPS Project