# Kreis und sekant schnittpunkt berechnen mit latitude longitude



## ts.tsogoo (15. Okt 2012)

Hallo Leute,

Ich versuche seit 3 Tagen das Problem zu Loesen. Ohne Erfolg. Hat jemand irgend ne Ahnung wie ich das Loesen kann. 
Es geht um ein Dienswagen Verwaltungs System dabei ein klein Modul fuer durchschnittliche Geschwindigkeit Berechner. Dafuer habe ich das Ort in Kreis Zonen geteilt. 
Man faehrt mit unterschiedlicher Geschwindigkeit fuer jeder Zone. Das heisst:
Ich fahre A bis D mit Geschwindigkeit v1 und D bis B mit v2. Die v1 und v2 sind mir bekannt. 
Die Entfernung zwischen zwei Koordinaten kann ich berechnen. Das heisst Laenge von AB, AC, CB sind mir auch bekannt.

Die Koordinaten von Google Map macht das ganze fuer mich schwerer. Ansonsten es ist ein Kreis, Sekant Schnittpunkt Berechnung. 

Ich bin fuer jeden Tipp dankbar.

Danke voraus!







R = 1 km
C = {48.137024,11.575249}
A = {48.139115,11.578081}
B = {48.146303,11.593102}
D = {?,?}


----------



## Marco13 (15. Okt 2012)

Falls man von kartsischen Koordinaten ausgehen kann, steht die Lösung in http://www.geometrictools.com/LibMathematics/Intersection/Wm5IntrLine2Circle2.cpp
(kann i.a. recht leicht nach Java portiert werden)


----------



## Fant (15. Okt 2012)

1. Geradegleichung und Kreisgleichung aufstellen
2. Geradengleichung in Kreisgleichung einsetzen
3. Quadratische Gleichung lösen
4. Falls es Lösungen gibt verifizieren, ob diese auch tatsächlich auf dem gewünschten Teilabschnitt der Geraden liegen.


----------



## ts.tsogoo (16. Okt 2012)

Fant hat gesagt.:


> 1. Geradegleichung und Kreisgleichung aufstellen
> 2. Geradengleichung in Kreisgleichung einsetzen
> 3. Quadratische Gleichung lösen
> 4. Falls es Lösungen gibt verifizieren, ob diese auch tatsächlich auf dem gewünschten Teilabschnitt der Geraden liegen.



Ich glaub nicht dass ich den Geo Koordinaten als double benuetzen kann. Das ist das Problem fuer mich.
Hat jemand irgendwelche Idee?


----------



## ts.tsogoo (18. Okt 2012)

Ich danke euch fuer alles.

```
import java.util.ArrayList;
import java.util.List;

import order.Coordinate;

public class CircleSecant {

	private Coordinate center;
	private double radius;
	private Coordinate start;
	private Coordinate end;

	public CircleSecant(Coordinate center, double radius, Coordinate start, Coordinate end) {
		this.center = center;
		this.radius = radius;
		this.start = start;
		this.end = end;
	}

	public ArrayList<Coordinate> getCutPoints() {
		// Constants
		double degree = 2 * Math.PI / 360;
		double radian = 1 / degree;
		double radius = 6371002.2; // Meters

		double r = this.radius * 1000; // meters;

		// Input in radians
		Coordinate c0 = new Coordinate(Math.toRadians(center.getLatitude()), Math.toRadians(center.getLongitude()));
		Coordinate a0 = new Coordinate(Math.toRadians(start.getLatitude()), Math.toRadians(start.getLongitude()));
		Coordinate b0 = new Coordinate(Math.toRadians(end.getLatitude()), Math.toRadians(end.getLongitude()));

		// Projection
		Coordinate A = new Coordinate(a0.getLatitude() * radius, a0.getLongitude() * Math.cos(c0.getLatitude())
				* radius);
		Coordinate B = new Coordinate(b0.getLatitude() * radius, b0.getLongitude() * Math.cos(c0.getLatitude())
				* radius);
		Coordinate C = new Coordinate(c0.getLatitude() * radius, c0.getLongitude() * Math.cos(c0.getLatitude())
				* radius);

		// Compute coefficents of quatradit equation
		Coordinate v = new Coordinate(A.getLatitude() - C.getLatitude(), A.getLongitude() - C.getLongitude());
		Coordinate u = new Coordinate(B.getLatitude() - A.getLatitude(), B.getLongitude() - A.getLongitude());

		double alpha = Math.pow(u.getLatitude(), 2) + Math.pow(u.getLongitude(), 2);
		double beta = u.getLatitude() * v.getLatitude() + u.getLongitude() * v.getLongitude();
		double gamma = Math.pow(v.getLatitude(), 2) + Math.pow(v.getLongitude(), 2) - Math.pow(r, 2);

		Coordinate t0 = getStrangeCoordinate(-beta, Math.sqrt(Math.pow(beta, 2) - alpha * gamma));
		Coordinate t1 = new Coordinate(t0.getLatitude() / alpha, t0.getLongitude() / alpha);

		List<Double> t = new ArrayList<Double>();
		if (t1.getLatitude() >= 0 && t1.getLatitude() <= 1)
			t.add(t1.getLatitude());
		if (t1.getLongitude() >= 0 && t1.getLongitude() <= 1)
			t.add(t1.getLongitude());

		ArrayList<Coordinate> result = new ArrayList<Coordinate>();
		for (double d : t) {
			double x = a0.getLatitude() + (b0.getLatitude() - a0.getLatitude()) * d;
			double y = a0.getLongitude() + (b0.getLongitude() - a0.getLongitude()) * d;

			result.add(new Coordinate(x * radian, y * radian));
		}

		return result;
	}

	private Coordinate getStrangeCoordinate(double x, double y) {
		return new Coordinate(x + y, x - y);
	}

}
```


----------

