Seite 1 von 1

Grafik mit Qt

Verfasst: 13. Dezember 2006 10:42
von jc-denton
Hallo,

Ich moechte gerne ein kleines Programm schreiben, das folgende Funktionalitaet erfuellt:

Der Benutzer clickt irgendwo in ein Feld, danach entstehen daraus Punkte, auf welche man (z.B. ueber ein Array zugreiffen kann). Daraus wird dann eine Gerade mit der "Least Sqare Method" [1] berechnet und gezeichnet.

Ich brauche dann also etwas um die Koordinaten der Clicks zu kriegen und etwas um Geraden und Punkten zu Zeichnen (aehnlich wie das Graphics Objekt in Java).

Kennt jemand ein kleines Beispiel, das die Verwendung der Entsprechenden Klassen erklaert und welche Qt Klassen sind dazu geignet?

Update:

Ich hab schon herausgefunden, wie ich Zeichnen kann:

Code: Alles auswählen

QPainter painter = new QPainter(this);
QPen p = new QPen();
painter.setPen(p);
painter.drawLine()
Nils

---
[1] http://en.wikipedia.org/wiki/Least_squares[/code]

Verfasst: 13. Dezember 2006 15:55
von upsala
Beschäftige dich mit QGraphicsScene, QGraphicsView und QGraphicsItem. (Im übrigen erklärt auch die deutsche Wikipedia dein mathematisches Problem.)

Verfasst: 13. Dezember 2006 20:07
von Volker
Oder guck dir auch mal QWT an http://qwt.sourceforge.net/

Verfasst: 13. Dezember 2006 21:53
von jc-denton
humm danke, aber ich moechte eigentlich erst mal etwas moeglichst einfaches.. (wie zB processing[1])

[1] http://www.processing.org

Verfasst: 22. Dezember 2006 17:33
von jc-denton
Ich habe das ganze nun mal mit processing gemacht (aus Zeitmangel). Werde aber versuchen es noch auf Qt zu porten..

Code: Alles auswählen

import processing.core.*;

public class Lsa extends PApplet 
{
	double[][] points;
	int n;  // number of points
	double m;
	double b;
	double avgx, avgy;
	
	public void setup() {
		
		 n = 0;
		 points = new double[2][5];
		 size(200,200);
		 fill(0,0,0,0);
		 noStroke(); fill(1,1,1);
		
	}
	
	// has to be defined, not sure why
	public void draw() {}
	
	public void mouseReleased() {
		  
		 if(n < 5) {
		   
		     rect(mouseX-1, mouseY-1, 2, 2);
		     points[0][n] = mouseX;
		     points[1][n] = mouseY;
		     System.out.println("X: " + mouseX + "Y: " + mouseY);
		     n++;
		     
		 } else {
		   
		   lsa_m();
		   lsa_b();
		   
		   int x0 = 0;
		   int y0 = (int)b;
		   
		   int x1 = 180;
		   int y1 = (int)(m*x1 + b);
		   
		   System.out.println(y0+ " " + y1);
		   
		   stroke(0,0,0);
		   line(x0, y0, x1, y1);
		 }
	 
	}
	
	void lsa_m() {
		  double s1=0; 
		  double s2=0;
		  
		  avgx = avg(points[0]);
		  avgy = avg(points[1]);
		  
		  for(int i=0; i<n; i++) {
		    s1 += points[0][i] * points[1][i];   
		    s2 += points[0][i] * points[0][i];
		  }
		  s1 -= n*avgx*avgy;
		  s2 -= n*avgx*avgx;
		  
		  m = s1/s2;
		}
	
	public void lsa_b() {
	  b = avgy - m * avgx;
	} 
	
	public double avg(double[] a) {
	  double s = 0;
	  for(int i=0; i<a.length; i++)
	    s += a[i];
	  return s/a.length; 
	}
	
	static public void main(String args[]) {  
		PApplet.main(new String[] { "lsa" });
	}
}