Hilfe bei Zeichenfunktion/-primitiven

Alles rund um die Programmierung mit Qt
Antworten
slash-ex
Beiträge: 239
Registriert: 30. März 2005 21:40

Hilfe bei Zeichenfunktion/-primitiven

Beitrag von slash-ex »

Ich wollte einen Ring zeichnen, und diesen Füllen, dazu benutze ich einen PainterPath:

Code: Alles auswählen

	QPainterPath plasmidPath;
	plasmidPath.addEllipse(rOuterCircle);
	plasmidPath.addEllipse(rInnerCircle);

	pPainter->setPen(borderPen);
	pPainter->drawPath(plasmidPath);

Nun hatte ich vor in diesen Ring ein paar Stellen zu markieren, indem ich Bereiche dieses Rings farbig nachzeichne.
Dabei entstehen Vierecke mit jeweils zwei bogenförmigen Kanten. Ich habe das ganze mal zur Veranschaulichung hochgeladen: Bild
Wie man sieht habe ich bisher nur mit QLines die beiden Kanten innerhalb des Rings nachgezeichnet.
Allerdings wollte ich das Ganze als abgeschlossene Form zeichnen um die Markierungen mit Farbe zu füllen (Bereiche zwischen QLINES bisher noch farblos). Ich weis aber nicht ganz wie ich das anstellen kann.
Mit PainterPathes springt die Linie immer wieder zu einem bestimmten Startpunkt zurück, an dem ich wiederrum schlecht einen Bogen zeichnen kann.

Das ist der bisherige Code... Vielleicht kann mir jemand weiter helfen.

Code: Alles auswählen

	QPoint pCircleCenter = QPoint(rRect.x()+fDiam/2, rRect.y()+fDiam/2);
	float fRadiusOut = fDiam / 2;	// bis zum äußeren kreis
	float fRadiusIn = fRadiusOut - fWidth_Circle;	// bis zum äußeren kreis
	for(int i = 0; i < m_lSites.size(); i++) {
		QColor cLineColor = m_lSites.at(i).m_cColor;
		cLineColor.setAlpha(128);
		QPen pLine(cLineColor, 1);
		pPainter->setPen(pLine);

		float f360Deg = 360.0f;
		float fXRel = (float)m_lSites.at(i).m_iStart / (float)m_iNucSeqSize * f360Deg;
		float fWidthRel = ((float)m_lSites.at(i).m_iEnd - (float)m_lSites.at(i).m_iStart) / (float)m_iNucSeqSize * f360Deg;

		QPointF pLIn(cos(fXRel * PI/180.0f) * fRadiusIn, sin(fXRel * PI/180.0f) * fRadiusIn);
		QPointF pLOut(cos(fXRel * PI/180.0f) * fRadiusOut, sin(fXRel * PI/180.0f) * fRadiusOut);
		float fXR = fXRel + fWidthRel;
		QPointF pRIn(cos(fXR * PI/180.0f) * fRadiusIn, sin(fXR * PI/180.0f) * fRadiusIn);
		QPointF pROut(cos(fXR * PI/180.0f) * fRadiusOut, sin(fXR * PI/180.0f) * fRadiusOut);

		QLineF lLeft(pLIn+pCircleCenter, pLOut+pCircleCenter);
		QLineF lRight(pRIn+pCircleCenter, pROut+pCircleCenter);
		pPainter->drawLine(lLeft);
		pPainter->drawLine(lRight);
	}
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Code: Alles auswählen

path.arcMoveTo(r2, angle1);
path.arcTo(r2, angle1, angle2-angle1);
path.arcTo(r1, angle2, angle1-angle2);
path.arcTo(r2, angle1, 0);
slash-ex
Beiträge: 239
Registriert: 30. März 2005 21:40

Beitrag von slash-ex »

ok, ich habe das ganze noch mal über die painterpath' gemacht und es funktioniert auch. aber mir ist noch was aufgefallen. ich wollte pfeile zeichnen, dazu habe ich als erstes probiert mit lines oder arcs die pfeile schrittweise zu zeichnen, dazu muss ich die koordinaten cmath'-technisch berechnen. wenn ich allerdings den bogen mit qt's drawaarc-funktion zeichne und daran dann meine errechneten linien hänge, kann es tatsächlich bei manchen winkeln zu diskrepanzen von +-1 pixel kommen ): also bin ich wieder auf painterpath' umgestiegen, bei denen durch den einsatz gleicher und vor allem verbundener zeichenoperationen keine lücken auftreten. allerdings werden diese formen immer mit einem qbrush aufgefüllt, was ich bei pfeilen nicht möchte. bisher habe ich also probiert das ganze mit einen transparenten brush zu malen, was auch funktioniert, allerdings würde mich noch interessieren, ob man das füllverhalten abschalten kann?

und dann wollte ich den kreis anti aliased zeichnen, und die lienien lieber ohne antialiasing, da bei feinen linien, die zudem waagerecht oder senkrecht verlaufen irgendwie effekte auftreten, dass sie dicker und verwaschen wirken (ca wie 2px linien, die tarnsparent sind). diagonal verlaufende lienien wirken dagegen scharf und dünn. insgesamt sieht das also ein wenig schlecht aus. nun ist das problem bei painterpath' dass ich nicht zwischendurch (je nach linientyp) das aa abstellen kann. kann man also evtl den anti aliasing algo verändern?
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Code: Alles auswählen

QBrush(Qt::NoBrush)
oder

Code: Alles auswählen

void QPainter::strokePath ( const QPainterPath & path, const QPen & pen )
Und an den AA-Einstellungen würde ich nichts ändern, da sich je nach Qt-Version und verwendeter Hardware sowieso wieder was ändern kann.
Antworten