Funktionsplotter: Polstellen

r74

Aktives Mitglied
Hallo Forum

Programmiert ist ein Formelparser und eine erste Version eines Funktionsplotters.
Der Plotter wertet die Funktionswerte zu äquidistanten Argumenten aus und verbindet diese durch eine gerade Linie.

So bereiten Funktionsterme wie 1/x, 1/x^2 selbstverständlich Probleme. Die beiden der Polstelle (x=0) am nächsten liegenden Punkte werden verbunden. Dies dürfte nicht sein.

Es gibt hier einige Forumsbeiträge zu diesem Thema, z.B. über das Auffinden von Nullstellen (hier im Nenner). Nullstellen über den Vorzeichenwechsel zu finden ist bei einigermassen "vernünftigen" Funktionen eine Möglichkeit. Klappt aber nicht für doppelte Nullstellen (wie im Nenner von 1/x^2).

Hat mir jemand zusätzliche Tipps?
 

Nika84

Mitglied
Hi!
ich brauche Hilfe.Das ist mein ganze Code
package pFunktionsPlotter;

import java.awt.*;
import java.text.DecimalFormat;

public class FktGraph extends Panel {
int maxX, maxY;
double xa, xe, ya, ye;
public FktGraph(double xa, double xe, double ya, double ye) {
this.xa = xa;
this.xe = xe;
this.ya = ya;
this.ye = ye;
}
double f(double x)
{
return 1/(x*x);
}
double g(double x)
{
return (-(x*x)-1);
}
int pixX(double x) {
return (int) ((x - xa) / (xe - xa) * maxX);
}
int pixY(double y) {
return (int) ((ye - y) / (ye - ya) * maxY);
}
double karX(int px) {
return px * (xe - xa) / maxX + xa;
}
double karY(int py) {
return ye - py * (ye - ya) / maxY;
}
int tickdistx(double w){ return (pixX(w)-pixX(0));}
int tickdisty(double w){ return (pixY(0)-pixY(w));}
DecimalFormat df = new DecimalFormat("#0.########");

void zeichneAchsen(Graphics g)
{
g.drawLine(0,pixY(0),maxX,pixY(0)); // x-Achse
g.drawLine(maxX-10,pixY(0)-5,maxX,pixY(0)); // Spitze
g.drawLine(maxX-10,pixY(0)+5,maxX,pixY(0));
g.drawLine(pixX(0),maxY,pixX(0),0); // y-Achse
g.drawLine(pixX(0)-5,10,pixX(0),0); // Spitze
g.drawLine(pixX(0)+5,10,pixX(0),0);

// Ticks auf der x-Achse
double tick = 1;
double start = 0;
while (tickdistx(tick) > 81 || tickdistx(tick) <31 )
{
if (tickdistx(tick) > 81) tick = tick/2;
if (tickdistx(tick) < 31) tick = tick*2;
}
start=0;
while (start-tick>xa)start = start-tick;
while (start < xe)
{
g.drawLine(pixX(start), pixY(0)-3,pixX(start),pixY(0) + 3); // Markierung senkrecht zur x-Achse
g.drawString(df.format(start),pixX(start),pixY(0) + 20); // Zahlenwert mit einer Kommastelle
start = start + 2*tick;
}
// Ticks auf der y-Achse
tick = 1;
start = 0;
while (tickdisty(tick) > 81 || tickdisty(tick) < 31 )
{
if (tickdisty(tick) > 81) tick = tick/2;
if (tickdisty(tick) < 31) tick = tick*2;
}
start=0;
while (start-tick>ya)start = start-tick;
while (start < ye)
{
g.drawLine(pixX(0)-3, pixY(start),pixX(0)+3,pixY(start));
if(start!=0) g.drawString(df.format(start),pixX(0)+5,pixY(start)+5);
start = start + tick;
}

}
public void paint(Graphics g) {

maxX = this.getBounds().width;
maxY = this.getBounds().height;
zeichneAchsen(g);
int oldx = 0;
int oldy = pixY(f(xa));
int py;

for (int px = 0; px < maxX; px = px + 1) {
py = pixY(f(karX(px)));
g.setColor(Color.blue);
g.drawLine(oldx, oldy, px, py);
oldx = px;
oldy = py;
}
for (int px = 0; px < maxX; px = px + 1) {
py = pixY(g(karX(px)));
g.setColor(Color.blue);
g.drawLine(oldx, oldy, px, py);
oldx = px;
oldy = py;
}

}
}

Wie kann ich Linie zwischen (0,-13) und (5,0) weg machen?
 
S

SlaterB

Gast
der rote dicke Hinweis zu Java-Tags ist nicht zu erkennen?
du postest nur ein Panel, ohne Restprogramm, main-Methode oder zumindest einen Tipp welche Werte man im Konstruktor übergeben sollte um ein interessantes Beispiel zu erhalten..

wie schon per PM geschrieben würdest du mit einem neuen eigenen Thema potentiell viel mehr Leser erreichen
 

Ähnliche Java Themen

Neue Themen


Oben