List <streckenModul.fahrStr> fstrRouteSearch(streckenModul.fahrStr Aktuell, streckenModul.referenzElement ZielSignal, List <streckenModul.fahrStr> Besucht) { Besucht.Add(Aktuell); if (Aktuell.Ziel.StrElement == ZielSignal.StrElement) { var Lizte = new List <streckenModul.fahrStr>(); Lizte.Add(Aktuell); return(Lizte); } else { foreach (var folge in Aktuell.folgeStraßen) { if ((!(Besucht.Contains(folge))) && (folge.Ziel != null)) { var rList = fstrRouteSearch(folge, ZielSignal, Besucht); if (!(rList == null)) { rList.Insert(0, Aktuell); return(rList); } Besucht.Add(Aktuell); } } } return(null); }
private void setZielSig(object sender, EventArgs e) { zielSignal = tmpSignal; if (startSignal == null) { MessageBox.Show("Startsignal nicht gesetzt!", "Fehler", MessageBoxButtons.OK); } route(); }
List <streckenModul.fahrStr> fstrRouteSearchStart(streckenModul.referenzElement StartSignal, streckenModul.referenzElement ZielSignal) { var Besucht = new List <streckenModul.fahrStr>(); foreach (var start_fstr in StartSignal.abgehendeFahrstraßen) { var rList = fstrRouteSearch(start_fstr, ZielSignal, Besucht); if (rList != null) { return(rList); } } return(null); }
public streckenModul.referenzElement getNearestSignal(int X, int Y) { double dist = -1; streckenModul.referenzElement nearestMod = null; foreach (streckenModul mod in modVisible) { foreach (var Signal in mod.StartSignale) { double modDist = getSigDistance(Signal, X, Y); if (((dist > modDist) || (dist == -1)) && (modDist >= 0)) { dist = modDist; nearestMod = Signal; } } } return(nearestMod); }
public double getSigDistance(streckenModul.referenzElement Signal, int X, int Y) { double deltaX = 999; double deltaY = 999; try { deltaX = Signal.SignalCoord.abs_X - pixToCoord(X, false); deltaY = Signal.SignalCoord.abs_Y - pixToCoord(Y, true); } catch (Exception) { deltaX = Signal.StrElement.b_X - pixToCoord(X, false); deltaY = Signal.StrElement.b_Y - pixToCoord(Y, true); } double dist = Math.Sqrt(deltaX * deltaX + deltaY * deltaY); return(dist); }
private void setStartSig(object sender, EventArgs e) { startSignal = tmpSignal; }
private void mMap_MouseUp(object sender, MouseEventArgs e) { if (mouseDown && (e.Button == MouseButtons.Left)) { mouseDown = false; int deltaX = e.X - mouseDownX_rel; int deltaY = e.Y - mouseDownY_rel; if ((selectRouteStart || selectRouteEnd) && !mouseMoved) { var act = (ZugFahrt)ZugFahrtBox.SelectedItem; if (selectRouteStart) { act.ZstartSignal = kartenZeichner.getNearestSignalStartZiel(e.X, e.Y, true); kartenZeichner.setLayers("signal_ziel", true); this.Invalidate(); selectRouteStart = false; } else { act.ZzielSignal = kartenZeichner.getNearestSignalStartZiel(e.X, e.Y, false); kartenZeichner.setLayers("signal_start", true); this.Invalidate(); selectRouteEnd = false; } if (act.ZstartSignal != null && act.ZzielSignal != null) { act.route = fstrRouteSearchStart(act.ZstartSignal, act.ZzielSignal); } updateZugFields(); mMap.Image = kartenZeichner.draw(); return; } int movementThreshold = 3; if ((Math.Abs(deltaX) > movementThreshold) || (Math.Abs(deltaY) > movementThreshold)) { kartenZeichner.move(deltaY, deltaX); mMap.Image = kartenZeichner.draw(); } else if (!mouseMoved) { if (moduToolStripMenuItem.Checked && punkteToolStripMenuItem.Checked) { var nächsteStation = kartenZeichner.getNearestStation(e.X, e.Y); if (kartenZeichner.getStationDistance(nächsteStation, e.X, e.Y) < 10) { nächsteStation.selected = !nächsteStation.selected; mMap.Image = kartenZeichner.draw(); modListBox.SetSelected(Module.mSammlung.IndexOf(nächsteStation), nächsteStation.selected); } } } mouseMoved = false; } if (e.Button == MouseButtons.Right) //HACK: Horrible Right Click Menu { var nächsteStation = kartenZeichner.getNearestStation(e.X, e.Y); horribleHackVariableThatHoldsRightClickModule = nächsteStation; tmpSignal = kartenZeichner.getNearestSignal(e.X, e.Y); if (nächsteStation == null || tmpSignal == null) { return; } string Signame = tmpSignal.Info; //MessageBox.Show(horribleHackVariableThatHoldsRightClickSignal.Info, "Nächstes Signal:", MessageBoxButtons.OK); MenuItem[] menuItems = new MenuItem[] { new MenuItem("Pixel: X" + e.X + " - Y" + e.Y), new MenuItem("Koordinaten: X" + kartenZeichner.pixToCoord(e.X, false).ToString("F1") + " - Y" + kartenZeichner.pixToCoord(e.Y, true).ToString("F1")), new MenuItem("Nächste Station: " + nächsteStation.modName + "; Distanz: " + kartenZeichner.getStationDistance(nächsteStation, e.X, e.Y).ToString()), new MenuItem("Nächstes Signal: " + tmpSignal.Info + "-" + Signame + "; Distanz: " + (1000 * kartenZeichner.getSigDistance(tmpSignal, e.X, e.Y)).ToString("F2")), new MenuItem(nächsteStation.modName + " im Explorer anzeigen", new EventHandler(showMod)) }; ContextMenu buttonMenu = new ContextMenu(menuItems); buttonMenu.Show(mMap, new Point(e.X, e.Y)); } }
private void drawSignal(List <textField> textManager, streckenModul.referenzElement Signal) { if (drawSignal_Namen) { textManager.Add(new textField(coordToPix(Signal.SignalCoord.abs_X, false), coordToPix(Signal.SignalCoord.abs_Y, true), Signal.ToString())); } int circleSize = 4; //Signaldreieck berechnen //Spitze int p1X = coordToPix(Signal.SignalCoord.abs_X, false); if (p1X > map_width_p || p1X < 0) { return; } int p1Y = coordToPix(Signal.SignalCoord.abs_Y, true); if (p1Y > map_width_p || p1Y < 0) { return; } //Vorbereitung für andere Punkte: //Vektor zeigt zum anderen Ende double VX = 0; double VY = 0; double p1Xcoord; double p1Ycoord; if (Signal.StrNorm) { p1Xcoord = Signal.StrElement.b_X; p1Ycoord = Signal.StrElement.b_Y; VX = Signal.StrElement.g_X - Signal.StrElement.b_X; VY = Signal.StrElement.g_Y - Signal.StrElement.b_Y; } else { p1Xcoord = Signal.StrElement.g_X; p1Ycoord = Signal.StrElement.g_Y; VX = Signal.StrElement.b_X - Signal.StrElement.g_X; VY = Signal.StrElement.b_Y - Signal.StrElement.g_Y; } //Normieren des Vektors double vlen = (Math.Sqrt(VX * VX + VY * VY)) * pixPerGrad; double VXnorm = VX / vlen; double VYnorm = VY / vlen; //Normalvektor berechnen double VXnormnorm = VYnorm; double VYnormnorm = -VXnorm; //"Unterer" Punkt double p2Xcoord = p1Xcoord + 8 * VXnorm + 4 * VXnormnorm; double p2Ycoord = p1Ycoord + 8 * VYnorm + 4 * VYnormnorm; int p2X = coordToPix(p2Xcoord, false); int p2Y = coordToPix(p2Ycoord, true); //"Oberer" Punkt double p3Xcoord = p1Xcoord + 8 * VXnorm - 4 * VXnormnorm; double p3Ycoord = p1Ycoord + 8 * VYnorm - 4 * VYnormnorm; int p3X = coordToPix(p3Xcoord, false); int p3Y = coordToPix(p3Ycoord, true); //Sammeln in Array: var points = new Point[3]; points[0] = new Point(p1X, p1Y); points[1] = new Point(p2X, p2Y); points[2] = new Point(p3X, p3Y); //Farbe aussuchen Brush SigCol = Brushes.Black; if (Signal.istStart && Signal.istZiel) { SigCol = Brushes.Orange; } else { if (Signal.istStart) { SigCol = Brushes.Green; } if (Signal.istZiel) { SigCol = Brushes.Red; } } framebuffer.FillPolygon(SigCol, points); //framebuffer.FillEllipse(SigCol, coordToPix(Signal.SignalCoord.abs_X, false) - circleSize / 2, coordToPix(Signal.SignalCoord.abs_Y, true) - circleSize / 2, circleSize, circleSize); }