# Method drawLine()



## Guido6372 (17. Okt 2007)

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 (17. Okt 2007)

garnicht!

wozu auch? es gibt keine halben pixel!!

Was hast du denn vor?


EDIT: je nach dem hilft das parsen nacht int


```
//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);
```


----------



## Wildcard (17. Okt 2007)

Gar nicht, da gehen nur ints. Für double values brauchst du eine Line2D.Double


----------



## Guido6372 (17. Okt 2007)

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.


----------



## Ariol (17. Okt 2007)

???

Poste doch mal deinen Code.


----------



## Guido6372 (17. Okt 2007)

```
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 (17. Okt 2007)

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 (17. Okt 2007)

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.


----------



## Guido6372 (17. Okt 2007)

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


----------



## Ariol (17. Okt 2007)

Wildcard hat gesagt.:
			
		

> Ariol hat gesagt.:
> 
> 
> 
> ...



OK, stimmt schon.


Habs jetzt mal mit Polyline gemacht:


```
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):


```
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
```


----------



## Guido6372 (17. Okt 2007)

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)
> 
> ...


----------



## Ariol (17. Okt 2007)

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

```
points = sortByX(points);
```
aus.


```
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);
	}
}
```


----------



## Gast (18. Okt 2007)

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.


----------



## Guido6372 (18. Okt 2007)

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


----------



## Ariol (18. Okt 2007)

hast du meine version mal getestet??

was ist denn die eigentliche aufgabe?


----------

