Method drawLine()

  • Themenstarter Themenstarter Guido6372
  • Beginndatum Beginndatum
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?
 
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);
 
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.
 
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;
	 }
	 }
 
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.
 
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.
 
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
 
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
 
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);
	}
}
 
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.
 
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.

Zurück
Oben