Hello,
I'm trying to write a program for directional angle calculation.
But my issue are the IF statements.
I have to test two variables in 4 different scenarios.
example Local y,x,n;
IF ( y>0 and x>0) then n:=ATAN( y/x); /// 1' scenario if the y or x is not greater next test
IF( y>0 and x<0) then n:=ATAN (y/x)+180; //// 2' scenario
IF( y<0 and x<0) then n:=ATAN(y/x)+180; //// 3' scenario
IF ( y<0 and x>0) then n:=ATAN(y/x)+360; ///// 4'
And i'm not sure how to write it.
Code:
IF ( y>0) THEN
IF (x>0) THEN
n:=ATAN(y/x);
ELSE
IF ( y>0) THEN
IF( x<0) THEN
n:=(ATAN(y/x))+pi;
ELSE
IF ( y<0) THEN
IF(x<0) THEN
n:=(ATAN(y/x))+pi;
ELSE
n:=(ATAN(y/x))+(2*pi);
I have tried like that, but i't doesnt give the correct awnser. And also at end of program i have to write END; like 6 times or so.
I would probably use a case statement for that task:
Code:
EXPORT Amer7scode(x,y)
BEGIN
LOCAL n, orig;
orig:=HAngle;
HAngle:=1;
CASE
IF y>0 AND x>0 THEN n:=ATAN(y/x) END;
IF y>0 AND x<0 THEN n:=ATAN(y/x)+180 END;
IF y<0 AND x<0 THEN n:=ATAN(y/x)+180 END;
IF y<0 AND x>0 THEN n:=ATAN(y/x)+360 END;
DEFAULT n:="error"
END;
HAngle:=orig;
RETURN n;
END;
-road
Thanks,
that worked like charm. I wonder where, and how you learn these tricks and expressions.
Here is the complete code for Directional Angle - Geodesy - HP Prime
Code:
EXPORT Directional()
BEGIN
LOCAL Ay,Ax,By,Bx;
INPUT({Ay,Ax,By,Bx},"Direkcioni", {"Y tacke A","X tacke A","Y tacke B","X tacke b"});
LOCAL y,x,n,c;
y:=By-Ay;
x:=Bx-Ax;
CASE
IF y>0 AND x>0 THEN n:=ATAN(y/x) END;
IF y>0 AND x<0 THEN n:=ATAN(y/x)+180 END;
IF y<0 AND x<0 THEN n:=ATAN(y/x)+180 END;
IF y<0 AND x>0 THEN n:=ATAN(y/x)+360 END;
DEFAULT n:="error"
END;
c:=→HMS(n);
RETURN c;
END;
(06-11-2021 11:06 AM)Amer7 Wrote: [ -> ]Hello,
I'm trying to write a program for directional angle calculation.
Why write a function when one is already built in?
look up ARG(X+
i*Y)
As a new prime user I appreciate seeing smaller programs even if they replicate built-in functions.
I have several questions.
1. How does the program know that the calculator is in degrees mode versus radians?
2. What does "c:=→HMS(n);" mean? It probably has to do with the HMS function
which I haven't used yet.
3. What is the english translation for the word "tacke"
Thanks.
I can answer the 1st 2
1 there is a system varable HAngle you can set to 0 for radian and 1 for degrees, by default it is set in the setup screen or app
2 →HMS() changes a degree to DMS
HMS→() changes DMS to degree
3 I dont know
(06-12-2021 03:05 AM)Dougggg Wrote: [ -> ]there is a system varable HAngle you can set to 0 for radian and 1 for degrees, by default it is set in the setup screen or app
On HP Prime emulator, HAngle cannot be set to 0 in CAS (Why?)
CAS> HAngle := 0 → "HAngle(0) Error: Bad Argument Value"
It might be better to use AAngle instead, see
http://edspi31415.blogspot.com/2018/02/h...mcalc.html
Code:
EXPORT bearing(x,y) // x=north, y=east
BEGIN
IF x = 0 THEN // avoid divide-by-0
y := sign(y)*90;
ELSE
AAngle := 2; // degree mode
y := atan(y/x) + (x<0)*180;
AAngle := 0; // restore
END;
return →HMS(y MOD 360);
END;
(06-11-2021 02:04 PM)toml_12953 Wrote: [ -> ]Why write a function when one is already built in?
look up ARG(X+i*Y)
Because there is a bug in ARG ?
see
https://www.hpmuseum.org/forum/thread-16977.html
We can use atan2 instead.
Code:
EXPORT bearing(x,y) // x=north, y=east
BEGIN
AAngle := 2; // degree mode
y := atan2(y,x);
AAngle := 0; // restore
return →HMS(y MOD 360);
END;
Don't forget to handle points on the vertical axis, including the origin. I'll arbitrarily assign 0 to atan(0,0). I haven't had nearly enough coffee yet and I'm not fluent in PPL, but in C++:
Code:
if (x==0) {
if (y == 0)
n = 0; // at the origin
else
n = 90 + 180*(y<0); // on the y axis
} else {
// C++ atan() returns radians, so convert to degrees
n = atan(y/x) * 180 / 3.141592653589792; // assume 1st quadrant
if (x < 0) n += 180; // adjust for quadrants 2 and 3
else if (y < 0) n += 360; // adjust for quadrant 4
}
(06-12-2021 11:53 AM)Albert Chan Wrote: [ -> ] (06-12-2021 03:05 AM)Dougggg Wrote: [ -> ]there is a system varable HAngle you can set to 0 for radian and 1 for degrees, by default it is set in the setup screen or app
On HP Prime emulator, HAngle cannot be set to 0 in CAS (Why?)
CAS> HAngle := 0 → "HAngle(0) Error: Bad Argument Value"
It might be better to use AAngle instead, see http://edspi31415.blogspot.com/2018/02/h...mcalc.html
Code:
EXPORT bearing(x,y) // x=north, y=east
BEGIN
IF x = 0 THEN // avoid divide-by-0
y := sign(y)*90;
ELSE
AAngle := 2; // degree mode
y := atan(y/x) + (x<0)*180;
AAngle := 0; // restore
END;
return →HMS(y MOD 360);
END;
(06-11-2021 02:04 PM)toml_12953 Wrote: [ -> ]Why write a function when one is already built in?
look up ARG(X+i*Y)
Because there is a bug in ARG ?
see https://www.hpmuseum.org/forum/thread-16977.html
The bug must have been fixed again. I get the proper 45 with all the examples in that thread.
(06-13-2021 05:35 AM)toml_12953 Wrote: [ -> ] (06-12-2021 11:53 AM)Albert Chan Wrote: [ -> ]Because there is a bug in ARG ?
see https://www.hpmuseum.org/forum/thread-16977.html
The bug must have been fixed again. I get the proper 45 with all the examples in that thread.
Strange... my G2 running firmware 14588 (2021 05 05) still has that bug (namely, arg(3+3.*i) in CAS view returns its answer in radians even when Prime is in Degrees mode). Make sure you're in CAS view, degree mode, and include the decimal point.
(06-13-2021 01:10 PM)Joe Horn Wrote: [ -> ] (06-13-2021 05:35 AM)toml_12953 Wrote: [ -> ]The bug must have been fixed again. I get the proper 45 with all the examples in that thread.
Strange... my G2 running firmware 14588 (2021 05 05) still has that bug (namely, arg(3+3.*i) in CAS view returns its answer in radians even when Prime is in Degrees mode). Make sure you're in CAS view, degree mode, and include the decimal point.
I just checked it again. Now it comes up with radians. I was sure I checked the angular mode before but I must not have. Of course in Home mode, it does work properly and that's the mode I always use so I never would have run into this bug.
I found that while in CAS mode the prime allows HAngle to be set to one or two.
After an attempt to do
HAngle:=0
an error message appears, namely:
"HAngle(0) Error: Bad Argument Value"
I wonder if this a feature or a bug and if it is causing the problems
noted in this thread.
It seems that setting AAngle is not affected.
Thanks.