Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



3 body, zjisteni uhlu

Seznam témat     Nová odpověď

Přihlásit se     Registrace     Zapomenuté heslo

Re: 3 body, zjisteni uhlu

Autor: tcesky

10:26:16 11.11.2009

Rychly priklad:
[code]
Demo for route Betzdorf to Luzern with hops from 100 to 200 km
240 cities in 225 milliseconds from total of 15510 cities
10557 links in 21 milliseconds
Links from Betzdorf in 133 milliseconds

Cost=335
Betzdorf - Strasbourg
Strasbourg - Luzern
Press any key to continue . . .[/code]

Algoritmus je prevzaty z
http://www.codeproject.com/KB/recipes/ShortestPathCalculation.aspx

Pocita se tam toho vic nez je potreba, ale dalsi cesty se mohou hodit.

Implementace je trivialni, vstupni data jsou v priloze
[code]
[color=#0000ff]using[/color][color=#000000] System;
[/color][color=#0000ff]using[/color][color=#000000] System.Collections.Generic;
[/color][color=#0000ff]using[/color][color=#000000] System.Linq;
[/color][color=#0000ff]using[/color][color=#000000] System.Text;
[/color][color=#0000ff]using[/color][color=#000000] System.IO;
[/color][color=#0000ff]using[/color][color=#000000] RouteEngine; [/color][color=#008000]// http://www.codeproject.com/KB/recipes/ShortestPathCalculation.aspx
[/color][color=#0000ff]using[/color][color=#000000] System.Diagnostics;

[/color][color=#0000ff]namespace[/color][color=#000000] SISWebmaster
{
[/color][color=#0000ff]class[/color][color=#000000] [/color][color=#2b91af]Program
[/color][color=#000000] {
[/color][color=#0000ff]static[/color][color=#000000] [/color][color=#0000ff]string[/color][color=#000000] data = [/color][color=#a31515]@"R:\tmp\SISWebmaster\cities.csv"[/color][color=#000000];
[/color][color=#0000ff]static[/color][color=#000000] [/color][color=#0000ff]void[/color][color=#000000] Main([/color][color=#0000ff]string[/color][color=#000000][[/color][color=#000000]] args)
{
[/color][color=#0000ff]var[/color][color=#000000] cities = [/color][color=#0000ff]new[/color][color=#000000] [/color][color=#2b91af]List[/color][color=#000000]<[/color][color=#2b91af]City[/color][color=#000000]>();
[/color][color=#2b91af]City[/color][color=#000000] btz = [/color][color=#0000ff]null[/color][color=#000000], luz = [/color][color=#0000ff]null[/color][color=#000000];
[/color][color=#0000ff]var[/color][color=#000000] re = [/color][color=#0000ff]new[/color][color=#000000] RouteEngine.[/color][color=#2b91af]RouteEngine[/color][color=#000000]();

[/color][color=#0000ff]double[/color][color=#000000] minHop = 100, maxHop = 200;
[/color][color=#0000ff]var[/color][color=#000000] sw = [/color][color=#0000ff]new[/color][color=#000000] [/color][color=#2b91af]Stopwatch[/color][color=#000000]();
sw.Start();
[/color][color=#0000ff]using[/color][color=#000000] ([/color][color=#0000ff]var[/color][color=#000000] sr = [/color][color=#0000ff]new[/color][color=#000000] [/color][color=#2b91af]StreamReader[/color][color=#000000](data))
{
sr.ReadLine();
[/color][color=#0000ff]string[/color][color=#000000] line;
[/color][color=#0000ff]while[/color][color=#000000] ([/color][color=#0000ff]null[/color][color=#000000] != (line = sr.ReadLine()))
{
[/color][color=#0000ff]var[/color][color=#000000] c = [/color][color=#0000ff]new[/color][color=#000000] [/color][color=#2b91af]City[/color][color=#000000](line);
[/color][color=#0000ff]if[/color][color=#000000] (c.ok)
{
[/color][color=#0000ff]if[/color][color=#000000] (c.name == [/color][color=#a31515]"Betzdorf"[/color][color=#000000]) btz = c;
[/color][color=#0000ff]if[/color][color=#000000] (c.name == [/color][color=#a31515]"Luzern"[/color][color=#000000]) luz = c;
cities.Add(c);
}
}
}
[/color][color=#0000ff]double[/color][color=#000000] maxDist = luz.Dist(btz);
[/color][color=#0000ff]int[/color][color=#000000] i, j;
[/color][color=#0000ff]int[/color][color=#000000] n = cities.Count;
[/color][color=#0000ff]for[/color][color=#000000] (i = 0; i < cities.Count; i++)
{
[/color][color=#0000ff]if[/color][color=#000000] (cities[[/color][color=#000000]i].Dist(luz) > maxDist || cities[[/color][color=#000000]i].Dist(btz) > maxDist) cities.RemoveAt(i--);
}
[/color][color=#0000ff]foreach[/color][color=#000000] ([/color][color=#0000ff]var[/color][color=#000000] c [/color][color=#0000ff]in[/color][color=#000000] cities) re.Locations.Add(c.loc);
sw.Stop();
[/color][color=#2b91af]Console[/color][color=#000000].WriteLine([/color][color=#a31515]"Demo for route {0} to {1} with hops from {2} to {3} km"[/color][color=#000000], btz.name, luz.name, minHop, maxHop);
[/color][color=#2b91af]Console[/color][color=#000000].WriteLine([/color][color=#a31515]"{0,10} cities in {1,8:# ##0} milliseconds from total of {2} cities"[/color][color=#000000], cities.Count, sw.ElapsedMilliseconds, n);
sw.Reset();
sw.Start();
n = cities.Count;
[/color][color=#0000ff]for[/color][color=#000000] (i = 0; i < n; i++)
[/color][color=#0000ff]for[/color][color=#000000] (j = i + 1; j < n; j++)
{
[/color][color=#0000ff]double[/color][color=#000000] d = cities[[/color][color=#000000]i].Dist(cities[[/color][color=#000000]j]);
[/color][color=#0000ff]if[/color][color=#000000] (d >= minHop && d <= maxHop) re.Connections.Add([/color][color=#0000ff]new[/color][color=#000000] [/color][color=#2b91af]Connection[/color][color=#000000](cities[[/color][color=#000000]i].loc, cities[[/color][color=#000000]j].loc, ([/color][color=#0000ff]int[/color][color=#000000])d));
}
sw.Stop();
[/color][color=#2b91af]Console[/color][color=#000000].WriteLine([/color][color=#a31515]"{0,10} links in {1,8:# ##0} milliseconds"[/color][color=#000000], re.Connections.Count, sw.ElapsedMilliseconds);


sw.Reset();
sw.Start();
[/color][color=#0000ff]var[/color][color=#000000] routes = re.CalculateMinCost(re.Locations[[/color][color=#000000]0]);
sw.Stop();
[/color][color=#2b91af]Console[/color][color=#000000].WriteLine([/color][color=#a31515]"Links from {0} in {1,8:# ##0} milliseconds"[/color][color=#000000], re.Locations[[/color][color=#000000]0], sw.ElapsedMilliseconds);

[/color][color=#0000ff]var[/color][color=#000000] route = routes[[/color][color=#000000]luz.loc];
[/color][color=#2b91af]Console[/color][color=#000000].WriteLine([/color][color=#a31515]""[/color][color=#000000]);
[/color][color=#2b91af]Console[/color][color=#000000].WriteLine([/color][color=#a31515]"Cost={0}"[/color][color=#000000], route.Cost);
[/color][color=#0000ff]foreach[/color][color=#000000] ([/color][color=#0000ff]var[/color][color=#000000] c [/color][color=#0000ff]in[/color][color=#000000] route.Connections)
[/color][color=#2b91af]Console[/color][color=#000000].WriteLine([/color][color=#a31515]"{0,-20} - {1}"[/color][color=#000000], c.A.Identifier, c.B.Identifier);
}
}
[/color][color=#0000ff]public[/color][color=#000000] [/color][color=#0000ff]class[/color][color=#000000] [/color][color=#2b91af]City
[/color][color=#000000] {
[/color][color=#0000ff]string[/color][color=#000000] z_name;
[/color][color=#0000ff]double[/color][color=#000000] z_lon, z_lat;
[/color][color=#0000ff]bool[/color][color=#000000] z_ok;
[/color][color=#2b91af]Location[/color][color=#000000] z_loc;
[/color][color=#0000ff]public[/color][color=#000000] [/color][color=#0000ff]string[/color][color=#000000] name { [/color][color=#0000ff]get[/color][color=#000000] { [/color][color=#0000ff]return[/color][color=#000000] z_name; } }
[/color][color=#0000ff]public[/color][color=#000000] [/color][color=#2b91af]Location[/color][color=#000000] loc { [/color][color=#0000ff]get[/color][color=#000000] { [/color][color=#0000ff]return[/color][color=#000000] z_loc; } }
[/color][color=#0000ff]public[/color][color=#000000] [/color][color=#0000ff]bool[/color][color=#000000] ok { [/color][color=#0000ff]get[/color][color=#000000] { [/color][color=#0000ff]return[/color][color=#000000] z_ok; } }
[/color][color=#808080]///[/color][color=#008000] [/color][color=#808080]


[/color][color=#000000] [/color][color=#808080]///[/color][color=#008000] Read one line with a city
[/color][color=#000000] [/color][color=#808080]///[/color][color=#008000] [/color][color=#808080]

[/color][color=#000000] [/color][color=#808080]///[/color][color=#008000] [/color][color=#808080][/color][color=#008000]Line[/color][color=#808080]
[/color][color=#000000] [/color][color=#808080]///[/color][color=#008000] [/color][color=#808080]
[/color][color=#000000] [/color][color=#808080]///[/color][color=#008000] Format is:
[/color][color=#000000] [/color][color=#808080]///[/color][color=#008000]
[/color][color=#000000] [/color][color=#808080]///[/color][color=#008000] ID,Valid,ITUCode,City,Capital,CityPopulation,Lon,Lat,LonOri,LatOri
[/color][color=#000000] [/color][color=#808080]///[/color][color=#008000] 1,1,LUX,Betzdorf,1,500,6.32,49.69,6.32,49.69
[/color][color=#000000] [/color][color=#808080]///[/color][color=#008000] [/color][color=#808080]

[/color][color=#000000] [/color][color=#0000ff]public[/color][color=#000000] City([/color][color=#0000ff]string[/color][color=#000000] line)
{
z_ok = [/color][color=#0000ff]false[/color][color=#000000];
[/color][color=#0000ff]var[/color][color=#000000] str = line.Split([/color][color=#a31515]','[/color][color=#000000]);
[/color][color=#0000ff]if[/color][color=#000000] (str.Length < 1) [/color][color=#0000ff]return[/color][color=#000000];
z_name = str[[/color][color=#000000]3].Trim();
[/color][color=#0000ff]if[/color][color=#000000] (![/color][color=#0000ff]double[/color][color=#000000].TryParse(str[[/color][color=#000000]6], [/color][color=#0000ff]out[/color][color=#000000] z_lon)) [/color][color=#0000ff]return[/color][color=#000000];
[/color][color=#0000ff]if[/color][color=#000000] (![/color][color=#0000ff]double[/color][color=#000000].TryParse(str[[/color][color=#000000]7], [/color][color=#0000ff]out[/color][color=#000000] z_lat)) [/color][color=#0000ff]return[/color][color=#000000];
z_loc = [/color][color=#0000ff]new[/color][color=#000000] [/color][color=#2b91af]Location[/color][color=#000000]();
z_loc.Identifier = z_name;
z_ok = [/color][color=#0000ff]true[/color][color=#000000];
}
[/color][color=#0000ff]public[/color][color=#000000] [/color][color=#0000ff]override[/color][color=#000000] [/color][color=#0000ff]string[/color][color=#000000] ToString() { [/color][color=#0000ff]return[/color][color=#000000] [/color][color=#0000ff]string[/color][color=#000000].Format([/color][color=#a31515]"{0}: {1} {2}"[/color][color=#000000], z_name, z_lon, z_lat); }

[/color][color=#0000ff]public[/color][color=#000000] [/color][color=#0000ff]double[/color][color=#000000] Dist([/color][color=#2b91af]City[/color][color=#000000] c)
{
[/color][color=#0000ff]if[/color][color=#000000] ([/color][color=#2b91af]Math[/color][color=#000000].Abs(z_lat - c.z_lat) > 9) [/color][color=#0000ff]return[/color][color=#000000] [/color][color=#0000ff]double[/color][color=#000000].MaxValue; [/color][color=#008000]// more than 1000 km
[/color][color=#000000] [/color][color=#0000ff]if[/color][color=#000000] ([/color][color=#2b91af]Math[/color][color=#000000].Abs(z_lon - c.z_lon) > 15) [/color][color=#0000ff]return[/color][color=#000000] [/color][color=#0000ff]double[/color][color=#000000].MaxValue; [/color][color=#008000]// reasonable test

[/color][color=#000000] [/color][color=#0000ff]double[/color][color=#000000] d, a;
Distance(z_lon, z_lat, c.z_lon, c.z_lat, [/color][color=#0000ff]out[/color][color=#000000] d, [/color][color=#0000ff]out[/color][color=#000000] a);
[/color][color=#0000ff]return[/color][color=#000000] d;
}
[/color][color=#808080]///[/color][color=#008000] [/color][color=#808080]
[/color][color=#000000] [/color][color=#808080]///[/color][color=#008000] Distance and bearing from a point to another
[/color][color=#000000] [/color][color=#808080]///[/color][color=#008000] [/color][color=#808080]

[/color][color=#000000] [/color][color=#808080]///[/color][color=#008000] [/color][color=#808080][/color][color=#008000]Longitude A[/color][color=#808080]
[/color][color=#000000] [/color][color=#808080]///[/color][color=#008000] [/color][color=#808080][/color][color=#008000]Latitude A[/color][color=#808080]
[/color][color=#000000] [/color][color=#808080]///[/color][color=#008000] [/color][color=#808080][/color][color=#008000]Longitude B[/color][color=#808080]
[/color][color=#000000] [/color][color=#808080]///[/color][color=#008000] [/color][color=#808080][/color][color=#008000]Latitude B[/color][color=#808080]
[/color][color=#000000] [/color][color=#808080]///[/color][color=#008000] [/color][color=#808080][/color][color=#008000]Distance A-B, km[/color][color=#808080]
[/color][color=#000000] [/color][color=#808080]///[/color][color=#008000] [/color][color=#808080][/color][color=#008000]bearing from A to B, degrees[/color][color=#808080]
[/color][color=#000000] [/color][color=#0000ff]static[/color][color=#000000] [/color][color=#0000ff]void[/color][color=#000000] Distance([/color][color=#0000ff]double[/color][color=#000000] lonA, [/color][color=#0000ff]double[/color][color=#000000] latA, [/color][color=#0000ff]double[/color][color=#000000] lonB, [/color][color=#0000ff]double[/color][color=#000000] latB, [/color][color=#0000ff]out[/color][color=#000000] [/color][color=#0000ff]double[/color][color=#000000] dist, [/color][color=#0000ff]out[/color][color=#000000] [/color][color=#0000ff]double[/color][color=#000000] azim) [/color][color=#008000]// in kilometres, degrees /* udaje ve stupnich */
[/color][color=#000000] {
[/color][color=#0000ff]double[/color][color=#000000] c;

[/color][color=#0000ff]double[/color][color=#000000] lon1 = lonA * [/color][color=#2b91af]Math[/color][color=#000000].PI / 180.0;
[/color][color=#0000ff]double[/color][color=#000000] lat1 = latA * [/color][color=#2b91af]Math[/color][color=#000000].PI / 180.0;
[/color][color=#0000ff]double[/color][color=#000000] lon2 = lonB * [/color][color=#2b91af]Math[/color][color=#000000].PI / 180.0;
[/color][color=#0000ff]double[/color][color=#000000] lat2 = latB * [/color][color=#2b91af]Math[/color][color=#000000].PI / 180.0;

c = [/color][color=#2b91af]Math[/color][color=#000000].Sin(lat1) * [/color][color=#2b91af]Math[/color][color=#000000].Sin(lat2)
+ [/color][color=#2b91af]Math[/color][color=#000000].Cos(lat1) * [/color][color=#2b91af]Math[/color][color=#000000].Cos(lat2) * [/color][color=#2b91af]Math[/color][color=#000000].Cos(lon1 - lon2);
[/color][color=#0000ff]if[/color][color=#000000] (c > 1.0) c = 1.0; [/color][color=#0000ff]if[/color][color=#000000] (c < -1.0) c = -1.0;
c = [/color][color=#2b91af]Math[/color][color=#000000].Acos(c);
dist = 6366.0 * c;
[/color][color=#0000ff]if[/color][color=#000000] (c <= 0.0)
{
azim = 0.0;
[/color][color=#0000ff]return[/color][color=#000000];
}
c = [/color][color=#2b91af]Math[/color][color=#000000].Sin(lon1 - lon2) * [/color][color=#2b91af]Math[/color][color=#000000].Cos(lat2) / [/color][color=#2b91af]Math[/color][color=#000000].Sin(c);
[/color][color=#0000ff]if[/color][color=#000000] (c > 1.0) c = 1.0; [/color][color=#0000ff]if[/color][color=#000000] (c < -1.0) c = -1.0;
c = [/color][color=#2b91af]Math[/color][color=#000000].Asin(c);
[/color][color=#0000ff]if[/color][color=#000000] (lat1 >= lat2) c += [/color][color=#2b91af]Math[/color][color=#000000].PI;
[/color][color=#0000ff]if[/color][color=#000000] (lat1 < lat2)
{
[/color][color=#0000ff]if[/color][color=#000000] (lon1 > lon2) c = 2.0 * [/color][color=#2b91af]Math[/color][color=#000000].PI - c;
[/color][color=#0000ff]else[/color][color=#000000] c = [/color][color=#2b91af]Math[/color][color=#000000].Abs(c);
}
azim = c;
azim *= 180.0 / [/color][color=#2b91af]Math[/color][color=#000000].PI;
}

}
}
[/color][/code]
[size=10px]Produkt lepiče kódu[/size]


Zdravim
TC

[/color][color=#000000] [/color][color=#808080]///[/color][color=#008000] Read one line with a city [/color][color=#000000] [/color][color=#808080]///[/color][color=#008000] [/color][color=#808080] [/color][color=#000000] [/color][color=#808080]///[/color][color=#008000] [/color][color=#808080][/color][color=#008000]Line[/color][color=#808080] [/color][color=#000000] [/color][color=#808080]///[/color][color=#008000] [/color][color=#808080] [/color][color=#000000] [/color][color=#808080]///[/color][color=#008000] Format is: [/color][color=#000000] [/color][color=#808080]///[/color][color=#008000] [/color][color=#000000] [/color][color=#808080]///[/color][color=#008000] ID,Valid,ITUCode,City,Capital,CityPopulation,Lon,Lat,LonOri,LatOri [/color][color=#000000] [/color][color=#808080]///[/color][color=#008000] 1,1,LUX,Betzdorf,1,500,6.32,49.69,6.32,49.69 [/color][color=#000000] [/color][color=#808080]///[/color][color=#008000] [/color][color=#808080] [/color][color=#000000] [/color][color=#0000ff]public[/color][color=#000000] City([/color][color=#0000ff]string[/color][color=#000000] line) { z_ok = [/color][color=#0000ff]false[/color][color=#000000]; [/color][color=#0000ff]var[/color][color=#000000] str = line.Split([/color][color=#a31515]','[/color][color=#000000]); [/color][color=#0000ff]if[/color][color=#000000] (str.Length < 1) [/color][color=#0000ff]return[/color][color=#000000]; z_name = str[[/color][color=#000000]3].Trim(); [/color][color=#0000ff]if[/color][color=#000000] (![/color][color=#0000ff]double[/color][color=#000000].TryParse(str[[/color][color=#000000]6], [/color][color=#0000ff]out[/color][color=#000000] z_lon)) [/color][color=#0000ff]return[/color][color=#000000]; [/color][color=#0000ff]if[/color][color=#000000] (![/color][color=#0000ff]double[/color][color=#000000].TryParse(str[[/color][color=#000000]7], [/color][color=#0000ff]out[/color][color=#000000] z_lat)) [/color][color=#0000ff]return[/color][color=#000000]; z_loc = [/color][color=#0000ff]new[/color][color=#000000] [/color][color=#2b91af]Location[/color][color=#000000](); z_loc.Identifier = z_name; z_ok = [/color][color=#0000ff]true[/color][color=#000000]; } [/color][color=#0000ff]public[/color][color=#000000] [/color][color=#0000ff]override[/color][color=#000000] [/color][color=#0000ff]string[/color][color=#000000] ToString() { [/color][color=#0000ff]return[/color][color=#000000] [/color][color=#0000ff]string[/color][color=#000000].Format([/color][color=#a31515]"{0}: {1} {2}"[/color][color=#000000], z_name, z_lon, z_lat); } [/color][color=#0000ff]public[/color][color=#000000] [/color][color=#0000ff]double[/color][color=#000000] Dist([/color][color=#2b91af]City[/color][color=#000000] c) { [/color][color=#0000ff]if[/color][color=#000000] ([/color][color=#2b91af]Math[/color][color=#000000].Abs(z_lat - c.z_lat) > 9) [/color][color=#0000ff]return[/color][color=#000000] [/color][color=#0000ff]double[/color][color=#000000].MaxValue; [/color][color=#008000]// more than 1000 km [/color][color=#000000] [/color][color=#0000ff]if[/color][color=#000000] ([/color][color=#2b91af]Math[/color][color=#000000].Abs(z_lon - c.z_lon) > 15) [/color][color=#0000ff]return[/color][color=#000000] [/color][color=#0000ff]double[/color][color=#000000].MaxValue; [/color][color=#008000]// reasonable test [/color][color=#000000] [/color][color=#0000ff]double[/color][color=#000000] d, a; Distance(z_lon, z_lat, c.z_lon, c.z_lat, [/color][color=#0000ff]out[/color][color=#000000] d, [/color][color=#0000ff]out[/color][color=#000000] a); [/color][color=#0000ff]return[/color][color=#000000] d; } [/color][color=#808080]///[/color][color=#008000] [/color][color=#808080] [/color][color=#000000] [/color][color=#808080]///[/color][color=#008000] Distance and bearing from a point to another [/color][color=#000000] [/color][color=#808080]///[/color][color=#008000] [/color][color=#808080] [/color][color=#000000] [/color][color=#808080]///[/color][color=#008000] [/color][color=#808080][/color][color=#008000]Longitude A[/color][color=#808080] [/color][color=#000000] [/color][color=#808080]///[/color][color=#008000] [/color][color=#808080][/color][color=#008000]Latitude A[/color][color=#808080] [/color][color=#000000] [/color][color=#808080]///[/color][color=#008000] [/color][color=#808080][/color][color=#008000]Longitude B[/color][color=#808080] [/color][color=#000000] [/color][color=#808080]///[/color][color=#008000] [/color][color=#808080][/color][color=#008000]Latitude B[/color][color=#808080] [/color][color=#000000] [/color][color=#808080]///[/color][color=#008000] [/color][color=#808080][/color][color=#008000]Distance A-B, km[/color][color=#808080] [/color][color=#000000] [/color][color=#808080]///[/color][color=#008000] [/color][color=#808080][/color][color=#008000]bearing from A to B, degrees[/color][color=#808080] [/color][color=#000000] [/color][color=#0000ff]static[/color][color=#000000] [/color][color=#0000ff]void[/color][color=#000000] Distance([/color][color=#0000ff]double[/color][color=#000000] lonA, [/color][color=#0000ff]double[/color][color=#000000] latA, [/color][color=#0000ff]double[/color][color=#000000] lonB, [/color][color=#0000ff]double[/color][color=#000000] latB, [/color][color=#0000ff]out[/color][color=#000000] [/color][color=#0000ff]double[/color][color=#000000] dist, [/color][color=#0000ff]out[/color][color=#000000] [/color][color=#0000ff]double[/color][color=#000000] azim) [/color][color=#008000]// in kilometres, degrees /* udaje ve stupnich */ [/color][color=#000000] { [/color][color=#0000ff]double[/color][color=#000000] c; [/color][color=#0000ff]double[/color][color=#000000] lon1 = lonA * [/color][color=#2b91af]Math[/color][color=#000000].PI / 180.0; [/color][color=#0000ff]double[/color][color=#000000] lat1 = latA * [/color][color=#2b91af]Math[/color][color=#000000].PI / 180.0; [/color][color=#0000ff]double[/color][color=#000000] lon2 = lonB * [/color][color=#2b91af]Math[/color][color=#000000].PI / 180.0; [/color][color=#0000ff]double[/color][color=#000000] lat2 = latB * [/color][color=#2b91af]Math[/color][color=#000000].PI / 180.0; c = [/color][color=#2b91af]Math[/color][color=#000000].Sin(lat1) * [/color][color=#2b91af]Math[/color][color=#000000].Sin(lat2) + [/color][color=#2b91af]Math[/color][color=#000000].Cos(lat1) * [/color][color=#2b91af]Math[/color][color=#000000].Cos(lat2) * [/color][color=#2b91af]Math[/color][color=#000000].Cos(lon1 - lon2); [/color][color=#0000ff]if[/color][color=#000000] (c > 1.0) c = 1.0; [/color][color=#0000ff]if[/color][color=#000000] (c < -1.0) c = -1.0; c = [/color][color=#2b91af]Math[/color][color=#000000].Acos(c); dist = 6366.0 * c; [/color][color=#0000ff]if[/color][color=#000000] (c <= 0.0) { azim = 0.0; [/color][color=#0000ff]return[/color][color=#000000]; } c = [/color][color=#2b91af]Math[/color][color=#000000].Sin(lon1 - lon2) * [/color][color=#2b91af]Math[/color][color=#000000].Cos(lat2) / [/color][color=#2b91af]Math[/color][color=#000000].Sin(c); [/color][color=#0000ff]if[/color][color=#000000] (c > 1.0) c = 1.0; [/color][color=#0000ff]if[/color][color=#000000] (c < -1.0) c = -1.0; c = [/color][color=#2b91af]Math[/color][color=#000000].Asin(c); [/color][color=#0000ff]if[/color][color=#000000] (lat1 >= lat2) c += [/color][color=#2b91af]Math[/color][color=#000000].PI; [/color][color=#0000ff]if[/color][color=#000000] (lat1 < lat2) { [/color][color=#0000ff]if[/color][color=#000000] (lon1 > lon2) c = 2.0 * [/color][color=#2b91af]Math[/color][color=#000000].PI - c; [/color][color=#0000ff]else[/color][color=#000000] c = [/color][color=#2b91af]Math[/color][color=#000000].Abs(c); } azim = c; azim *= 180.0 / [/color][color=#2b91af]Math[/color][color=#000000].PI; } } } [/color][/code] [size=10px]Produkt lepiče kódu[/size] Zdravim TC

Citovat příspěvek

 

Re: 3 body, zjisteni uhlu

Autor: tcesky

8:39:35 11.11.2009

[ital]Podle Vašeho popisu je to jednoduché. Ale podle něj bych musel znát přesně letecké trasy. Nezapomeňte prosím, že z Prahy do Ostravy se dá letět i, když to přeženu, přes Paříž nebo přes Bratislavu. To aby existovaly presne trasy, jake ve Vašem píkladě 2 by určitě znamenalo udělat seznam Odkud Kam, Přes co. Což v mojem případě nepůjde, protože letiště nebudou jen ty existující, ale každý uživatel (hráč), bude mít svoje vlastní, může jich na celou Evropu připadnout klidně i 100000. Těžko potom stanovovat onen zmiňovaný seznam.[/ital]

Predpokladam, ze tato namitka byla napsana budto z hladu nebo na zaklade nejake citove deprivace a ze nebyla minena vazne.

1. [ital]Ale podle něj bych musel znát přesně letecké trasy.[/ital] Resit ulohu spojeni mezi body jejichz polohu neznam je asi zajimave, ale tematicky to spise patri do diskuze o vesteni. Stejne plati pro body jejichz polohu sice znam, ale neznam delku cesty mezi nimi.

2. [ital]To aby existovaly presne trasy, jake ve Vašem píkladě 2 by určitě znamenalo udělat seznam Odkud Kam, Přes co.[/ital] Myslim, ze to je cilem, nikoliv vstupem ulohy. V mem [bold]píkladě[/bold] mam seznam moznych spoju a ne [ital]Odkud Kam, Přes co[/ital]. Bez toho seznamu to vazne nejde (viz bod 1)

3. [ital]Což v mojem případě nepůjde, protože letiště nebudou jen ty existující, ale každý uživatel (hráč), bude mít svoje vlastní,[/ital] jaky je rozdil mezi existujicim letistem a letistem vlastnenym uzivatelem? Jeden by si myslel, ze uloha je najit cestu a jednoho bodu do druheho s vyuzitim nejakych letist (treba "existujicich" plus letist "vlastnenych" mymi kamarady). Ten seznam musim pred zacatkem vypoctu mit v kazdem pripade (viz bod1)

4. [ital]může jich na celou Evropu připadnout klidně i 100000.[/ital] Ponechme stranou, ze 100 000 je docela male cislo.

Vhodne je na zacatku ohodnotit vsechny mozne spoje, protoze ne z kazdeho letiste muze byt mozny spoj do vsech ostatnich a pak se hodi rovnou vyloucit nevhodne, treba prilis dlouhe spoje. Bude to N*N/2 trivialnich vypoctu vzdalenosti po nichz zbude vyzname mene nez N*N/2 pouzitelnych spoju. Pro algoritmy navrhovane predrecniky, vcetne elegantni implementace mnou ukazane, neni milion uzlu zadny zvlastni problem.

Naivni je pro vychozi bod slozite pocitat nejblizssiho favorita, postoupit do nej a tam opet slozite hledat dalsiho favorita. I v pripade, ze by se naslo reseni na prvni pokus to znamena (N-1) * (pocet skoku) slozitejsich vypoctu a navic nebude jasne, zda je nalezena cesta nejkratsi ci jinak optimalni.

5. [ital]Já na tom zkusím zapracovat softwarově a až budu mít nachystané letiště tak, jak by měly být, tak pak, jestli bude mít někdo náladu se na to můžeme konkrétně mrknout.Možná, že na to v průběhu chystání kódu příjdu sám, ale to dost pochybuju. [/ital] Kdyz posles seznam letist a jejich vzajemnych letovych vzdalenosti tak obetuji deset minut na to abych Ti ukazal implementaci reseni. Kdyz posles seznam letist a bez vzajemnych letovych vzdalenosti tak obetuji deset a pul minuty na to abych Ti ukazal implementaci reseni pro geodeticke vzdalenosti mezi letisti.

Zdravim

TC

Citovat příspěvek

 

Re: 3 body, zjisteni uhlu

Autor: grafnev

20:21:55 10.11.2009

[ital]a mezi nima se může nacházet třeba 100 hráčských letišť, a to třeba jenom ve směru Praha - Ostrava, ale ten algoritmus by se přece už ze začátku rozjížděl na všechny světové strany a hledal nejkratší cestu. Nebo to chápu špatně?[/ital]

Presne tak ... nicmene i kdyz to bude 100 000 letist, tak to zase tak hrozne cislo neni ... nehlede na to, ze vetsinou cilove letiste nalezne mnohem drive.

Citovat příspěvek

 

Re: 3 body, zjisteni uhlu

Autor: Maaartin

19:10:59 10.11.2009

> [ital]Kdyby ale body (ted nemyslim v tomto leteckem priklade) byly pohyblive, urcite by ten uhlovy algoritmus byl rychlejsi...[/ital]

To je dost nepravdepodobny - pocitani uhlu je zde proste nesmysl a ani nevim jestli to muze vest ke spravnymu vysledku.

Musim rict, ze TC to tentokrat vystihnul.

> [ital]a mezi nima se může nacházet třeba 100 hráčských letišť, a to třeba jenom ve směru Praha - Ostrava, ale ten algoritmus by se přece už ze začátku rozjížděl na všechny světové strany a hledal nejkratší cestu.[/ital]

Ten alg nejdriv expanduje uzly ze kterych to muze byt bliz, takze Pariz by se na radu nedostala vubec (be je dal nez startovni bod). Koukni na
http://en.wikipedia.org/wiki/Dijkstra's_algorithm
pro ten animovany gif cizich jazyku netreba.

Citovat příspěvek

 

Re: 3 body, zjisteni uhlu

Autor: SIS Webmaster

18:43:57 10.11.2009

[quote]Kolik je cest z Prahy do Ostravy?[/quote]

Podle Vašeho popisu je to jednoduché. Ale podle něj bych musel znát přesně letecké trasy. Nezapomeňte prosím, že z Prahy do Ostravy se dá letět i, když to přeženu, přes Paříž nebo přes Bratislavu. To aby existovaly presne trasy, jake ve Vašem píkladě 2 by určitě znamenalo udělat seznam Odkud Kam, Přes co. Což v mojem případě nepůjde, protože letiště nebudou jen ty existující, ale každý uživatel (hráč), bude mít svoje vlastní, může jich na celou Evropu připadnout klidně i 100000. Těžko potom stanovovat onen zmiňovaný seznam. Ono

[quote]
Praha - Brno 200
Brno - Ostrava 100
Praha - Pardubice 100
Pardubice - Ostrava 120
[/quote]

je moc hezke ale ve skutečnosti by to bylo

Praha - Ostrava

a mezi nima se může nacházet třeba 100 hráčských letišť, a to třeba jenom ve směru Praha - Ostrava, ale ten algoritmus by se přece už ze začátku rozjížděl na všechny světové strany a hledal nejkratší cestu. Nebo to chápu špatně? Omlouvám se, jestli mi dáváte správné příklady a já je špatně chápu. Jenom si v tomhle směru potřebuju spoustu věcí ujasnit a ty nesrovnalostí mi každým přibývají, takže se cítím docela zmateně :-) Já na tom zkusím zapracovat softwarově a až budu mít nachystané letiště tak, jak by měly být, tak pak, jestli bude mít někdo náladu se na to můžeme konkrétně mrknout.Možná, že na to v průběhu chystání kódu příjdu sám, ale to dost pochybuju.

Citovat příspěvek

 

Re: 3 body, zjisteni uhlu

Autor: tcesky

16:56:59 10.11.2009

[ital]Kdyby ale body (ted nemyslim v tomto leteckem priklade) byly pohyblive, urcite by ten uhlovy algoritmus byl rychlejsi...
[/ital]

To je zcela nesporne. Zatimco u pevnych bodu by se pocitaly vzdalenosti jenom jednou a uhly jenom jednou, tak pri pohyblivych bodech be se po kazdem pohybubu jednoho bodu musely prepocitat vsechny vzdalenosti do nej ale uhly by se mohly ponechat puvodni. Na reseni by to totiz nemelo vliv protoze na tech uhlech stejne nezalezi.

Zdravim

TC

Citovat příspěvek

 

Re: 3 body, zjisteni uhlu

Autor: tcesky

16:37:53 10.11.2009

[ital]Zatim zde popisovany algoritmy nechapu, nejde mi do hlavy jejich funkcnost, kdyz nepouiji zadny smerovy vektor, ale vy tomu urcite rozumite, takze verim, ze to touhle cestou pujde a ikdyz ji zatim nerozumim, tak se do ni casem dostanu :-)[/ital]
[code]
Praha - Brno 200
Brno - Ostrava 100
Praha - Pardubice 100
Pardubice - Ostrava 120
[/code]


Kolik je cest z Prahy do Ostravy?
Ktera je kratsi?
Jaky je rozdil azimutu Pardubice->Praha a azimutu Pardubice->Ostrava? Azimut se musi pocitat od hotelu Grand.

Zdravim
TC

Citovat příspěvek

 

Re: 3 body, zjisteni uhlu

Autor: SIS_Webmaster

16:32:04 10.11.2009

OK, zamerim se na postup dle jiz overenych.

Kazdopadne to co bylo na to grafu (modra cesta delsi nez cervena) temi uhly by mi vysly presne tyto dve cesty a znal bych jejich delky, tudiz bych vybral tu kratsi. Rikal jsem, ze temi uhly by vznikl dlouhy strom... Vysledku by samozrejme bylo nekolik, malokdy jen jeden, stejne jako u tech ostatnich algoritmu. Do tehle doby jsem promyslel ten uhlovy algoritmus a nenasel jsem zadny problem. Az ted sem se podival sem a zkusim se tedy zamerit na ty jiz overene algoritmy. Tak me napada, ze ty overene budou rychlejsi, protoze vzdalenosti se vypocitaji jenom jednou... Kdyby ale body (ted nemyslim v tomto leteckem priklade) byly pohyblive, urcite by ten uhlovy algoritmus byl rychlejsi...

Zatim zde popisovany algoritmy nechapu, nejde mi do hlavy jejich funkcnost, kdyz nepouiji zadny smerovy vektor, ale vy tomu urcite rozumite, takze verim, ze to touhle cestou pujde a ikdyz ji zatim nerozumim, tak se do ni casem dostanu :-)

Citovat příspěvek

 

Re: 3 body, zjisteni uhlu

Autor: tcesky

15:04:15 10.11.2009

[ital]Z [bold]jineho uhlu [/bold]pohledu vlastne tvrdite, ze je jednodussi bez znalosti matematiky nalez novy (Vas) algoritmus, ktery resi tuto ulohu, nez pochopit nejaky existujici overeny a dokazany ... coz se mi nezda. [/ital]

Myslel jsem, ze stanovovani uhlu jiz bylo pro diskutovany problem zavrzeno.

Zdravim
TC

Citovat příspěvek

 

Re: 3 body, zjisteni uhlu

Autor: justik

14:54:04 10.11.2009

Dijkstra algoritmus:

http://cs.wikipedia.org/wiki/Dijkstr%C5%AFv_algoritmus
http://209.85.129.132/search?q=cache:3vYKSyIdlnQJ:mj.ucw.cz/vyuka/0607/ads1/11-dijkstra-booklet.ps+floyd+warshall&cd=7&hl=cs&ct=clnk&gl=cz&lr=lang_cs&client=firefox-a

Floyd Warshall:

www.civ.cvut.cz/info/download_prednasky.php?name=ti_08.ppt
http://cs.wikipedia.org/wiki/Floyd-Warshall%C5%AFv_algoritmus

Grafove algoritmy obecne

zcu.arcao.com/kiv/pt/prednasky/grafove_algoritmy.ppt
http://ksvi.mff.cuni.cz/~dvorak/vyuka/UIN009/Cesty_tisk.pdf

Citovat příspěvek

 

Re: 3 body, zjisteni uhlu

Autor: grafnev

14:42:12 10.11.2009

Oprava:
1)Uhel M4, M1, M2 je mensi nez M4, M1, M3

Citovat příspěvek

 

Re: 3 body, zjisteni uhlu

Autor: grafnev

14:40:03 10.11.2009

[ital]Nenachazim jinou moznost reseni, a do vysokoskolske matematiky bych zachazel opravdu nerad, protoze, a to reknu narovinu, te vubec nerozumim[/ital]

Byt na vasem miste, tak bych tem algoritmum venoval pozornost (neni v tom zadna slozita matematika), usetrite nakonec vic casu, nez kdyz budete vymyslet nejaka jina reseni.

Z jineho uhlu pohledu vlastne tvrdite, ze je jednodussi bez znalosti matematiky nalez novy (Vas) algoritmus, ktery resi tuto ulohu, nez pochopit nejaky existujici overeny a dokazany ... coz se mi nezda.

Jeste dotazek: Neexistuje neco jako letecke koridory, nebo lze letat po primce? Pri hledani nejkratsi cesty napr. pomoci dijkstrova algoritmu nakrmite graf proste hodnotami (vzdalenosti at jiz primou, nebo koridorem ... muzete zapocitat i protivitr, nebo muzete hodnotit trasu treba podle ceny paliva na letistich nebo podle atraktivity leteckeho personalu) a ten algoritmus najde nejvyhodnejsi cestu ... je mu fuk co tam je za cisla.

Zde mate protipriklad:

[img]http://bayimg.com/image/aaenoaacm.jpg[/img]

Protoze jsem liny hledat vzorecky nebudu dopocitavat zbytek uhlu a vzdalenosti, ale modra cesta je urcite delsi nez cervena ... protoze soucet delek dvou stran trojuhelnika je vetsi nez zbyvajici strana (jedna se o prvni cast cesty).

Jo dostat se mam z M1 do M4.

S mestem M2 lze urcite hybnout tak aby byly splneny podminky:
1)Uhel M4, M1, M2 je mensi nez M4, M3, M2
2)Vzdalenost M1-M2 je mensi nez M1-M3
3)Vzdalenost M2-M4 je vetsi nez dolet
4)Vzdalenost M2-M3 je mensi nez dolet

Zde je krasny priklad, kdy kratsi cesta vede z M1 do mesta M3, ktere svira vetsi uhel a je dale nez mesto M2.

Nez zacnete premyslet, jak toto vyresit, tak si predstavte slozitejsi priklad, kde by se letelo treba pres 10 mest a pri kazdem mezipristani muze nastat tato situace.

Btw. Presne tohle je pripad, kdy se skola(nemusi byt nutne vysoka)/teorie hodi ... viz prispevky dale, neni nutne pocitat zadne uhly neni treba zadna geometrie, ani souradnice mest ... jak jiz bylo psano pouze graf vzdalenosti a pak se jiz projizdi standardnimi algoritmy.

P.S. Myslim, ze s algoritmem zde urcite nekdo (vcetne me) poradi ... neni to vubec slozite (pokud to ovsem nechcete pocitat paralelne :).

Citovat příspěvek

 

Re: 3 body, zjisteni uhlu

Autor: justik

18:11:38 09.11.2009

Na hledání nejkratších cest zkuste Dijkstra algoritmus nebo Floyd-Warshalův algoritmus...

Citovat příspěvek

 

Re: 3 body, zjisteni uhlu

Autor: JSH

17:01:16 09.11.2009

Tak tohle je typický příklad pro hledání nejkratší cesty v grafu.
Letiště jsou uzly, vzdušné čáry mezi nimi hrany. Vezmu jen ty trasy, které jsou kratší než je dolet, ohodnotím je podle délky, připočtu cenu mezipřistání abych neskákal po malých kouscích a na takhle získaný graf pustím třeba A*. Není vůbec nutné počítat úhly. Počítají se jenom vzdálenosti.
http://en.wikipedia.org/wiki/A*_search_algorithm

Citovat příspěvek

 

Re: 3 body, zjisteni uhlu

Autor: tcesky

16:56:59 09.11.2009

To je nerozumny postup.

1. mas danou mnozinu uzlu (letiste)
2. Vyrobis si mnozinu spoju (uzel kazdy s kazdym jsou-li vzdalene mene nez 200 km)
3. Ze spojnic vyrobis nejkratsi cestu

http://www.codeproject.com/KB/recipes/ShortestPathCalculation.aspx je tak jednoduche, ze se to da prepsat do cehokoliv.

Zdravim

TC

Citovat příspěvek

 

Re: 3 body, zjisteni uhlu

Autor: SISWebmaster

16:51:58 09.11.2009

Nenachazim jinou moznost reseni, a do vysokoskolske matematiky bych zachazel opravdu nerad, protoze, a to reknu narovinu, te vubec nerozumim :-)

Citovat příspěvek

 

Re: 3 body, zjisteni uhlu

Autor: SISWebmaster

16:48:37 09.11.2009

Popisu problematiku, nejde o pouziti standardniho algoritmu pro vypocet nejkratsi cesty...

Nejlepsi bude to popsat primo na roblemu ve kterem toto resim.

Predstavte si mapu evropy. Na ni naneste zakladni osy X a Y. Rekneme, ze A[0,0] bude letiste Praha. Veskere dalsi body jsou letiste po cele Evrope. Ted vim, ze kazde letadlo ma omezeny dolet, tedy kolem Prahy se vytvori pomyslny kruh, napr 200km. Nyni zjistim smer vektoru mezi Prahou a cilem (Warsava). Dejme tomu, ze tento bude svirat s osou x uhel 30°. Z Prahy do Warsavy bez mezipristani nedoletim (200km dolet), tudiz zjistim veskere letiste v okruhu 200km od Prahy a jejich vektory. Vyberu 1 nebo pokud je jich vic, tak 2 letiste, ktere budou svirat s vektorem Praha - Warsava nejmensi uhly (letiste1, letiste2) z techto letist vytvorim opet vektory letiste1-Warsava, letiste2-Warsava, zjistim, jestli se jiz Warsava nachazi v doletu alespon jednoho z nich a kdyz ne, tak se cely kolobeh opakuje...

Doufam, ze to alespon nekdo pochopi :-D

Citovat příspěvek

 

Re: 3 body, zjisteni uhlu

Autor: tcesky

16:44:04 09.11.2009

[ital]nezbyde mi tedy nez zkouset co bude nejrychlejsi[/ital] porovnani rychlosti atanu2 a acosu je dozajista bohuliba cinnost.

Pocitat uhly pri hledani nejkratsi cesty je take dobra kratochvile, ale jeji prakticky vyznam se blizi nule.

Zdravim

TC

Citovat příspěvek

 

Re: 3 body, zjisteni uhlu

Autor: JSH

16:38:38 09.11.2009

Tak přesně tohle ti doporučoval Mi.Chal už ve třetím příspěvku.

Citovat příspěvek

 

Re: 3 body, zjisteni uhlu

Autor: SISWebmaster

16:31:28 09.11.2009

Tak dneska jsem jeste pozadal v praci sefa, ktery se analytickou matematikou a maticovymy systemy zabyva cely zivot a ten mi doporucil skalarni soucin vektoru...

A[3,0]; B[0,0]; C[0,-3]

B je vrcholem úhlu

R1x = (Ax-Bx)
R1y = (Ay-By)
R2x = (Cx-Bx)
R2y = (Cy-By)

|r1| = ODMOCNINA(R1x^2+R1y^2) = Vektor A->B
|r2| = ODMOCNINA(R2x^2+R2y^2) = Vektor C->B

s = R1x*R2x + R1y*R2y = skalarni soucin vektoru

cosAlfa = s/(|r1|*|r2|)

nezbyde mi tedy nez zkouset co bude nejrychlejsi :-D

Citovat příspěvek

 

Re: 3 body, zjisteni uhlu

Autor: tcesky

14:03:05 09.11.2009

Bez pocitani uhlu: http://www.codeproject.com/KB/recipes/ShortestPathCalculation.aspx

Zdravim
TC

Citovat příspěvek

 

Re: 3 body, zjisteni uhlu

Autor: grafnev

13:45:30 09.11.2009

Jen tak pro zajimavost - dotaz: Ta nejkratsi cesta se pocita tak aby se prosly vsechny body? Pokud ano, tak kolik jich tak zvladas? :)

Citovat příspěvek

 

Re: 3 body, zjisteni uhlu

Autor: justik

21:51:53 08.11.2009

V prikladu neni atan2, ale atan. Detekce kvadrantu je prenechana programatorovi, aby si tazatel uvedomil, jak se souvisi hodnoty dy, dy s jednotlivymi kvadranty...

Ohledne pomeru dx/dy resp. dy/dx. Zalezi, k jake ose vztahuji smer. Pokud bych dal nulovy smer do kladne vetve osy y, bude se jednat o pomer dx/dx. Pokud by byl nulovy smer vztazen ke kladne vetvi osy x, bude tam pomer dy/dx. Volba nuloveho smeru je vzhledem k uhlu sevrenem dvema prvky invariantni....

Slo by to samozrejme zapsat efektivneji s vyuzitim atan2, tohle byl takovy akademicky priklad :-).

Citovat příspěvek

 

Re: 3 body, zjisteni uhlu

Autor: Fredy Pumpicka

20:35:46 08.11.2009

mno ... nechci byt stoura, ale vsude tu pisete atan2 ( x , y ), ale z odkazu [url]http://www.manpagez.com/man/3/atan2/[/url] vyplyva, ze by melo byt atan2 ( y, x ).

Fredy

Citovat příspěvek

 

Re: 3 body, zjisteni uhlu

Autor: justik

18:45:49 08.11.2009

Uhel spoctes jako rozdil dvou azimutu...

Vypocet azimutu usecky urcene dvema body viz kod...

Pak uhel definovan jako rozdil dvou azimutu. V tomto pripade:

Pro prvni azimut

dx=x1-x2
dy=y1-y2

Pro druhy azimut:

dx=x3-x2
dy=y3-y2

Citovat příspěvek

 

Re: 3 body, zjisteni uhlu

Autor: justik

18:40:35 08.11.2009

Psano po pameti, snad tam nebude moc chyb...

[code]
#define RO 180/(4.0*atan(1.0));

dx=x2-x1
dy=y2-y1

if ((dy!=0)&&(dx!=0))
{
if (dy!=0)
{
if (dx==0)
{
if (dy>0)
{
azim=0;
}

else
{
azim=180;
}
}

else
{
double fi=atan(dx/dy)*RO;

if ((dx>0)&&(dy>0))
{
azim=fi;
}

else if ((dx>0)&&(dy<0))
{
azim=180-fi;
}

else if((dx<0)&&(dy<0))
{
azim=fi+180;
}

else
{
azim=360-fi;
}
}
}

//dy=0
else
{
if (dx>0)
{
azim=90;
}

else
{
azim=270;
}
}
}
[/code]

Citovat příspěvek

 

Re: 3 body, zjisteni uhlu

Autor: greybeard

16:54:39 08.11.2009

Převeď si to na úhel mezi vektory A-B, C-B. U každého vektoru samostatně spočti úhel od osy +x pomocí atan2 a odečti. Arkustangens má tu chybu, že vrací úhel jen v rozmezí od (-90,90). K přesnému rozlišení je třeba testovat, ve kterém kvadrantu vektor leží a podle toho pak spočítat úhel. Stačí si to nakreslit, je to docela jednoduché. Výpočet pak bude fungovat, jak potřebuješ.

Vlastík

Citovat příspěvek

 

Re: 3 body, zjisteni uhlu

Autor: Maaartin

17:51:36 07.11.2009

> [ital]prohledaval sem internet na ten atan2 a vicekrat jsem objevil podminku, ze kdyz uhel<0, tak to pricte 360 a hotovo[/ital]

V manualu pisou, ze the atan2() function computes the principal value of the arc tangent ale uz nepisou co ta principal value je. Nejpis cislo v intervalu (-pi, pi] jako v Jave
http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Math.html#atan2(double, double)
Takze rozdil je v (-2*pi, 2*pi], takze jednorazovy pricteni staci. Ale overil bych si to.

> [ital]Budu pak pro dany uhel hledat uhlove nejblizsi body a pak dlasi a dalsi a dalsi, muze z toho vyjit docela obrovsky strom, proto jde o rychlost[/ital]

Pak mozna nepocitej uhel ale zkus vystacit s nakym vektorem.

Citovat příspěvek

 

Re: 3 body, zjisteni uhlu

Autor: SISWebmaster

17:01:20 07.11.2009

Jde o to, ze potrebuju, aby vypocet, ktery nebude zrovna kratky, byl pokud mozno co nejrychlejsi, a ten atan2 je suprove rychly, prohledaval sem internet na ten atan2 a vicekrat jsem objevil podminku, ze kdyz uhel<0, tak to pricte 360 a hotovo, nejspis to tak bude nejlepsi. Budu pak pro dany uhel hledat uhlove nejblizsi body a pak dlasi a dalsi a dalsi, muze z toho vyjit docela obrovsky strom, proto jde o rychlost :-) Díky za rady,ted uz vim, jak pokracovat :-)

Citovat příspěvek

 

Re: 3 body, zjisteni uhlu

Autor: Maaartin

16:40:22 07.11.2009

Tim ze pocitas uhel jako rozdil dvou uhlu se urco dostanes na hodnoty z vetsiho intervalu nez <0, 360> ci <-90, 270>. Vzit vysledek modulo 360 je urco dobre. Ale nevim jestli pricteni 360 k zapornymu vysledku musi stacit.

> [ital]Nechapu, jak funguje ta první funkce.[/ital]
Proto jsem psal
http://www.manpagez.com/man/3/atan2

Pomoci cos fi = u.v / (|u|.|v|) to jde urco taky, ale je s tim vic prace bo arccos ti nerekne tolik infomace, musis pak jeste zkoumat znamenka. Proto existuje atan2.

Citovat příspěvek

 

Strana výpisu

1

 

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: