Portál AbcLinuxu, 9. května 2025 23:15
double getFi() {
final double signRe = signum(re);
final double signIm = signum(im);
if (signRe == 0.0d) {
if (signIm == 0.0d) {
return 0.0d;
} else if (signIm == 1.0d) {
return PI05;
} else {
return -PI05;
}
}
if (signIm == 0.0d) {
if (signRe == 0.0d) {
return 0.0d;
} else if (signRe == 1.0d) {
return 0.0d;
} else {
return -PI;
}
}
double result;
if (abs(im) <= abs(re)) {
result = atan(im / re);
if (signRe == 1.0d) {
if (signIm == 1.0d) {
//upper right - no change
} else {
//lower right - no change
}
} else {
if (signIm == 1.0d) {
//upper left
result = PI + result;
} else {
//lower left
result = -PI + result;
}
}
} else {
result = atan(re / im);
if (signIm == 1.0d) {
result = PI05 - result;
} else {
result = -PI05 - result;
}
}
return result;
}
Důležité je, že ta moje implementace vrací hodnoty v rozsahu <-Pi, Pi>, zatímco ta "ukázková" (triviální) jen v rozsahu <-Pi/2, Pi/2>, což způsobuje přesně tu chybu ve vykreslování, kterou jste ukázal.
Poznámky:
Complex
používám názvy vnitřních proměnných re
, im
místo Re
, Im
PI05
je konstanta s hodnotou Math.PI * 0.5d
getFi()
je zase možná až příliš složitá; důležité ale je, že vrací správné hodnotyJFrame
až po tom stisku tlačítka. A o stisku tlačítka se dozvíte tak, že na to tlačítko "navěsíte" listener - ale tady vás opět odkážu na ten tutorial, konkrétně na kapitolu Writing Event Listeners.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.