Rysowanie grotu strzałki na obiekcie Graphics

0

Witam.

Zagadnienie niby proste, alew praktyce wcale nie trywialne. Chodzi mi o to, aby mając linię zadeklarowaną w sposób: (x1, y1) (x2, y2) narysować ją na obiekcie Graphics (bądź Graphics2D), a następnie dorysować na jej końcu grot strzałki (wystarczą dwie kreski pod odpowiednim kątem). Nie widziałem takiej opcji w standardowym pakiecie klas Javy, więc szukam NAJPROSTSZEGO rozwiązania używając jak najmniej obliczeń. Oczywiście rozwiązanie ma działać dla linii pod narysowanych pod każdym kątem.

Macie jakieś pomysły?

Z góry thx.

P.S. Zamierzony efekt (aby nie było niedomówień ;-) ): user image

0

a jaki widzisz problem z wyznaczeniem równania kierunkowego prostej i potem wyznaczenie dwóch prostych nachylonych do niej pod odpowiednim kątem? Przecież to poziom wykresu funkcji (chyba gimnazjum)

0

A jeszcze łatwiej Narysować strzałkę tak jak pokazałeś a potem zastosować transformację dla wszystkich końców owych trzech prostych. Wzory na obracanie w przestrzeni o zadany kąt nie są skomplikowane i ogólnodostępne na sieci.

0

Oleksy_Adam: dzięki za informację. Była o wiele pomocniejsza niż wymądrzanie matematyka. Znalazłem gdzieś trochę kodu napisanego w Delphi i przerobienie go zajęło mi 2 minuty:

import java.awt.Graphics;
import java.awt.geom.Point2D;

public class Test extends java.applet.Applet {
	public void paint(Graphics g) {
		double x[] = new double[3];
		double y[] = new double[3];

		Point2D p = new Point2D.Double(50, 50);
		Point2D k = new Point2D.Double(400, 90);

		double arc = Math.atan2(-k.getY() + p.getY(), k.getX() - p.getX());

		double r = Math.sqrt(Math.pow(k.getX() - p.getX(), 2) + Math.pow(k.getY() - p.getY(), 2)) * 0.95;

		x[0] = p.getX() + Math.round(r * Math.cos(arc + 0.015));
		y[0] = p.getY() + Math.round(r * -Math.sin(arc + 0.015));
		x[1] = p.getX() + Math.round(r * Math.cos(arc - 0.015));
		y[1] = p.getY() + Math.round(r * -Math.sin(arc - 0.015));
		x[2] = k.getX();
		y[2] = k.getY();

		g.drawLine((int) p.getX(), (int) p.getY(), (int) k.getX(), (int) k.getY());
		g.drawLine((int) x[0], (int) y[0], (int) x[2], (int) y[2]);
		g.drawLine((int) x[1], (int) y[1], (int) x[2], (int) y[2]);
	}
}

Być może nie jest optymalny, ale każdy chcący go zaadoptować do swoich potrzeb powinien już wiedzieć o co biega.

Pozdro!

0
baterman napisał(a)

Oleksy_Adam: dzięki za informację. Była o wiele pomocniejsza niż wymądrzanie matematyka. Znalazłem gdzieś trochę kodu napisanego w Delphi i przerobienie go zajęło mi 2 minuty:
ręce opadają... A do podtarcia sobie tyłka też potrzebujesz gotowy kod??

0

Chodziło jedynie o ukazanie Ci, drogi kolego, że każda rada (byle na temat) może pomóc w rozwiązaniu problemu o wiele bardziej niż teksty w klimacie "wygoogluj sobie" albo komentarze na temat trywialności solucji! Nikogo nie proszę o gotowe rozwiązanie - prosiłem o poradę na temat dostępnych możliwości. Chyba dość wyraźnie to sprecyzowałem A jeśli uważasz, że głupia odpowiedź na posta jest coś warta, to chyba błądzisz bardziej niż ja szukając pomocy wśród ludzi Twojego pokroju. I po co te dyskusje, gdy wystarczyło trochę życzliwości?

Uprzejmie proszę o wykasowanie całego posta bo mnie szlak trafia, jak coś takiego widzę, a dałem się ponieść emocjom za co przepraszam osoby czytające ten wątek.

0

Zastanawiam się na jaki ch*** się tłuczecie skoro odpowiedź padła, rozwiązanie jest... Jak skakać to na prv, gadu, mail!

1 użytkowników online, w tym zalogowanych: 0, gości: 1