Method drawLine()

Status
Nicht offen für weitere Antworten.
G

Guido6372

Gast
Hi,

wie kann ich denn double Werte in eine drawLine() method packen??

Bekomme immer die Fehlermeldung:
The method drawLine(int,int,int,int) in the type Graphics is not applicable for the arguments(double,double,double,double)"

Help?
 

Ariol

Top Contributor
garnicht!

wozu auch? es gibt keine halben pixel!!

Was hast du denn vor?


EDIT: je nach dem hilft das parsen nacht int

Code:
//Wenn du diese Variablen hast (können natürlich auch andere sein)
double x1 = 3.5;
double y1 = 4.8;
double x2 = 5.8;
double y2 = 10.3;

g.drawLine((int) x1, (int) y1, (int) x2, (int) y2);
 
G

Guido6372

Gast
Ich soll eine Linie zeichnen lassen die bei der die Werte vorher mittels Math.cos und Math.sin ausgerechnet werden. Die Werte sind double. Wenn ich aus denen int mach dann gibt das keine Linie sondern nur einen punkt.
 
G

Guido6372

Gast
Code:
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.*;
import java.math.*;


public class Bild3 extends Canvas{
	 public void paint(Graphics g){
		 
	 
	 double a= 1.0;
	 double b=1./2.;
	 double c=1./3.;
	 double m=7.0;
	 double n=17.0;
	 double t;
	 
	 
	 

	for( t=-5.0; t<5.0;t++){
		 
		   int x=(int)(a*(Math.cos(t))+b*(Math.cos(m*t))+c*(Math.sin(n*t)));
		   int y=(int)(a*(Math.sin(t))+b*(Math.sin(m*t))+c*(Math.cos(n*t)));

	 
	 g.drawLine( x, y, x, y);
	 g.setColor(Color.white);
	 }
	 t=t+1;
	 }
	 }
 

Marco13

Top Contributor
Wenn du eine Linie von (0.1,0) nach (0.2,0) zeichnen willst, wird dem Computer nichts anderes übrig bleiben, als den Pixel bei (0,0) einzufärben und dann aufzuhören.

Skalier' die double-Werte ALLE mit 100 oder so, befor du sie nach int castest.
 

Wildcard

Top Contributor
Ariol hat gesagt.:
garnicht!

wozu auch? es gibt keine halben pixel!!
So stimmt's aber auch nicht. Nicht nur der Bildschirm kann als Ausgabemedium in betracht kommen, daher gibt es mit der Graphics2D API eben auch double Genauigkeit. Ein Drucker bspw. kann wesentlich mehr DPI haben.
 
G

Guido6372

Gast
Da ist noch mehr falsch ich weiß nur leider nicht genau was
 

Ariol

Top Contributor
Wildcard hat gesagt.:
Ariol hat gesagt.:
garnicht!

wozu auch? es gibt keine halben pixel!!
So stimmt's aber auch nicht. Nicht nur der Bildschirm kann als Ausgabemedium in betracht kommen, daher gibt es mit der Graphics2D API eben auch double Genauigkeit. Ein Drucker bspw. kann wesentlich mehr DPI haben.

OK, stimmt schon.


Habs jetzt mal mit Polyline gemacht:

Code:
import java.awt.Canvas;
import java.awt.Graphics;
import java.awt.Point;
import java.util.ArrayList;

public class Bild3 extends Canvas
{
	public void paint(Graphics g)
	{

		double a = 1.0;
		double b = 1. / 2.;
		double c = 1. / 3.;
		double m = 7.0;
		double n = 17.0;
		
		ArrayList<Point> points = new ArrayList<Point>();
		
		
		for(double t = -5.0; t < 5.0; t++)
		{

			int x = (int) (a * (Math.cos(t)) + b * (Math.cos(m * t)) + c * (Math.sin(n * t)));
			int y = (int) (a * (Math.sin(t)) + b * (Math.sin(m * t)) + c * (Math.cos(n * t)));

			System.out.println("X:" + x + ", Y:" + y);
			points.add(new Point(x,y));
		}
		
		int size = points.size();
		
		int[] xValues = new int[size];
		int[] yValues = new int[size];
		
		for(int i = 0; i < size; i++)
		{
			xValues[i] = points.get(i).x;
			yValues[i] = points.get(i).y;
		}
		
		g.drawPolygon(xValues, yValues, size);
	}
}

aber das bringt nicht wirklich was, bei solchen Werten (sind die int-Werte):

Code:
X:0, Y:0
X:0, Y:0
X:-1, Y:0
X:0, Y:-1
X:1, Y:-1
X:1, Y:0
X:0, Y:1
X:0, Y:1
X:-1, Y:0
X:-1, Y:0
 
G

Guido6372

Gast
hmm vielleicht hab ich die Aufgabe auch falsch verstanden/umgesetzt.

Hatte als Hilfestellung nur das hier:

x = a*cos(t)+b*cos(m*t)+c*sin(n*t)

y = a*sin(t)+b*sin(m*t)+c*cos(n*t)

mit

-5 < t < 5

a=1, b=1/2, c=1/3, m=7, n=17
 

Ariol

Top Contributor
Ich hab dir mal was geschrieben.

Ist zwar insgesamt etwas komplizierter, aber lass es dir einfach mal ausgeben (ich hoffe ich hab das richtig verstanden)

Wenn die Werte in der falschen Reihenfolge kommen kommentier einfach die Zeile
Code:
points = sortByX(points);
aus.

Code:
import java.awt.Canvas;
import java.awt.Graphics;
import java.awt.Point;
import java.util.ArrayList;

public class Bild3 extends Canvas
{
	public double getMinX(ArrayList<double[]> points)
	{
		if(points == null || points.size() == 0) return 0.0;
		
		double value = points.get(0)[0];
		
		for(double[] point : points)
		{
			if(point[0] < value) value = point[0];
		}
		
		return value;
	}
	public double getMinY(ArrayList<double[]> points)
	{
		if(points == null || points.size() == 0) return 0.0;
		
		double value = points.get(0)[1];
		
		for(double[] point : points)
		{
			if(point[1] < value) value = point[1];
		}
		
		return value;
	}
	public double getMaxX(ArrayList<double[]> points)
	{
		if(points == null || points.size() == 0) return 0.0;
		
		double value = points.get(0)[0];
		
		for(double[] point : points)
		{
			if(point[0] > value) value = point[0];
		}
		
		return value;
	}
	public double getMaxY(ArrayList<double[]> points)
	{
		if(points == null || points.size() == 0) return 0.0;
		
		double value = points.get(0)[1];
		
		for(double[] point : points)
		{
			if(point[1] > value) value = point[1];
		}
		
		return value;
	}
	
	public ArrayList<double[]> sortByX(ArrayList<double[]> points)
	{		
		for(int i = 0; i < points.size(); i++)
		{
			for(int j = i; j < points.size(); j++)
			{
				if(points.get(j)[0] < points.get(i)[0])
				{
					double[] point = points.get(i);
					points.set(i, points.get(j));
					points.set(j, point);
				}
			}
		}
		
		return points;		
	}
	
	public void paint(Graphics g)
	{

		double a = 1.0;
		double b = 1. / 2.;
		double c = 1. / 3.;
		double m = 7.0;
		double n = 17.0;
		
		ArrayList<double[]> points = new ArrayList<double[]>();
		
		
		for(double t = -5.0; t < 5.0; t++)
		{

			double x =  (a * (Math.cos(t)) + b * (Math.cos(m * t)) + c * (Math.sin(n * t)));
			double y =  (a * (Math.sin(t)) + b * (Math.sin(m * t)) + c * (Math.cos(n * t)));

			System.out.println("X:" + x + ", Y:" + y);
			
			double[] point = {x,y};
			points.add(point);
		}
		
		points = sortByX(points);
		
		for(double[] p : points)
		{
			System.out.println("X:" + p[0] + ", Y:" + p[1]);
		}
		
		int canvasHeight = getHeight();
		int canvasWidth = getWidth();
		
		double height = getMaxX(points)-getMinX(points);
		double width = getMaxY(points)-getMinY(points);
		
		double multiplrHeight = canvasHeight/height;
		double multiplrWidth = canvasWidth/width;
		
		
		int size = points.size();
		
		
		
		int[] xValues = new int[size];
		int[] yValues = new int[size];
		
		for(int i = 0; i < size; i++)
		{
			xValues[i] = (int)((points.get(i)[0]-getMinX(points))*multiplrWidth);
			yValues[i] = (int)((points.get(i)[1]-getMinY(points))*multiplrHeight);
		}
		
		g.drawPolyline(xValues, yValues, size);
	}
}
 
G

Gast

Gast
Hey Guido. Das Problem ist, dass die Werte a,b und c falsch sind. Damit du wirklich einen sinus/cosinus siehst, müssen diese werte wesentlich größer als 1 sein. ein sinus/cosinus schwankt nämlich zwischen den werten -1 und 1. Multiplizierst du das mit 1/2 dann schwankt er zwischen den werten -0.5 und 0.5, was, wie bereits gesagt wurde viel zu klein ist, um auf dem Bildschirm ausgegeben zu werden. Nimm für a mal den Wert 20 oder so, dann siehst du auch tatsächlich etwas am bildschirm.
 
G

Guido6372

Gast
Problem ist nur dass ich die Aufgabe so von einem Prof gestellt bekommen hat und soweit ich das mitbekommen habe, haben meine Kommilitonen das teilweise schon fertig und es geht :(
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M JavaFX Non-static method 'widthProperty()' cannot be referenced from a static context AWT, Swing, JavaFX & SWT 4
beli3ver JavaFX Anwendung startet nicht, kann den Fehler nicht finden (Exception in Application start method) AWT, Swing, JavaFX & SWT 1
Z JavaFX Exception in Application start method AWT, Swing, JavaFX & SWT 2
B AWT actionPerformed Method funktioniert nicht AWT, Swing, JavaFX & SWT 12
S Java Swing Print() method AWT, Swing, JavaFX & SWT 4
U JavaFX Error: Handler Method not found AWT, Swing, JavaFX & SWT 3
H Swing Spiel: Maexchen: method cannot be applied to given types AWT, Swing, JavaFX & SWT 3
T Swing No suitable Method found for add AWT, Swing, JavaFX & SWT 4
H Event Handling Externe Method schliesst Hauptapplikation AWT, Swing, JavaFX & SWT 6
N Swing Exception: Comparison method violates its general contract! AWT, Swing, JavaFX & SWT 13
J Calling a method from another class AWT, Swing, JavaFX & SWT 2
hdi ViewportView der JScrollPane - welche Method synchronisiert? AWT, Swing, JavaFX & SWT 15
S AWT-EventQueue-0 NullPointerExeption bei drawLine AWT, Swing, JavaFX & SWT 5
H drawLine im JFrame FullScreenWindow AWT, Swing, JavaFX & SWT 12
U drawLine mit Tooltip AWT, Swing, JavaFX & SWT 1
J drawLine() auf JFrame funktioniert nicht AWT, Swing, JavaFX & SWT 4
S Frage zu drawLine AWT, Swing, JavaFX & SWT 14
T Label + DrawLine AWT, Swing, JavaFX & SWT 6
X Durch DrawLine verschwindet das Fenster und die Objekte AWT, Swing, JavaFX & SWT 13
N Alle Pixel-Koordinaten von z.B. g.drawLine(.) speichern AWT, Swing, JavaFX & SWT 7
L Linie mit drawLine auf JPanel AWT, Swing, JavaFX & SWT 7
M drawLine() in JPanel hinzufügen ohne Neuzeichnen AWT, Swing, JavaFX & SWT 3
K drawLine mit Kollisionsabfrage? AWT, Swing, JavaFX & SWT 4
A Repaint unterdrücken bei DrawLine in JPanel AWT, Swing, JavaFX & SWT 4
R drawLine gibt hässliche linie AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben