| Autor |
Beitrag |
Clemens L.
      
Beiträge: 158
Win Xp SP3
D6 Enterprise, Turbo Delphi Explorer
|
Verfasst: Mo 02.02.09 18:00
Hallo mal wieder,
ich habe ein kleines Problem. Ich habe eine Linie, die folgendermaßen vorliegt:
Delphi-Quelltext 1: 2: 3: 4:
| TLine = record line : array of TPoint; speed : array of integer; end; |
Das Speed ist erstmal egal. In Line liegen die Punkte, die alle nacheinenander auf einer Linie liegen. Nun versuche ich eine Prozedur zu schreiben, die mir in der Nähe von Punkt Nummer X eine "Beule" einbaut. Moderiert von Narses: Bild als Anhang hochgeladen
So ähnlich sollte es dann aussehen. Durch die Beule darf die Linie NICHT Länger werden, es dürfen keine Array-Elemente hinzugefügt oder entfernt werden.
Hat jemand eine Idee wie ich das realisieren könnte? Mir kommt grad einfach kein Einfall..  Ich krieg einfach keine richtige Kurve hin.
Moderiert von Narses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Mo 02.02.2009 um 18:17
Einloggen, um Attachments anzusehen!
_________________ Gruß, Clemens
Vor dem 27.04.08 als "hackerTreff" bekannt!
Zuletzt bearbeitet von Clemens L. am Mo 02.02.09 18:24, insgesamt 1-mal bearbeitet
|
|
Calculon
      
Beiträge: 676
Win XP Professional
Delphi 7 PE, Delphi 3 PRO
|
Verfasst: Mo 02.02.09 18:19
Clemens L. hat folgendes geschrieben : | | (..) Durch die Beule darf die Linie NICHT Länger werden, (..) |
Weißt du was der kürzeste Abstand zwischen zwei Punkten ist? Ich geb' dir einen Tipp: Es ist keine Beule...
_________________ Hallo Mutti
|
|
Clemens L. 
      
Beiträge: 158
Win Xp SP3
D6 Enterprise, Turbo Delphi Explorer
|
Verfasst: Mo 02.02.09 18:24
Hmm gut .. Müssen natürlich Elemente ins Array eingefügt werden  Hab ich mal wieder nicht gerade gedacht ... Wie meinst du das mit "Es ist keine Beule"?
_________________ Gruß, Clemens
Vor dem 27.04.08 als "hackerTreff" bekannt!
|
|
Gausi
      
Beiträge: 8554
Erhaltene Danke: 481
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Mo 02.02.09 18:35
Nicht unbedingt. Wenn man als "Länge" die Anzahl der Pixel definiert, dann kann man eine "Beule" einfügen, ohne dass die Länge größer wird.
_________________ We are, we were and will not be.
|
|
Dude566
      
Beiträge: 1592
Erhaltene Danke: 79
W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
|
Verfasst: Mo 02.02.09 18:45
Wieso wenn man den Umweg also die Beule macht, ist es doch schon eine weitere Strecke und so auch mehr Pixel?
Irgendwo habe ich einen Denkfehler. 
_________________ Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
|
|
Calculon
      
Beiträge: 676
Win XP Professional
Delphi 7 PE, Delphi 3 PRO
|
Verfasst: Mo 02.02.09 18:48
_________________ Hallo Mutti
|
|
GTA-Place
      

Beiträge: 5248
Erhaltene Danke: 2
WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
|
Verfasst: Mo 02.02.09 18:50
Nein, ich hab mal im Anhang ein Bild, wie es auch ohne zusätzliche Punkte geht. ... Okay, Calculon hat es schon erklärt, aber trotzdem das Bild.
Einloggen, um Attachments anzusehen!
_________________ "Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
|
|
jfheins
      
Beiträge: 918
Erhaltene Danke: 158
Win 10
VS 2013, VS2015
|
Verfasst: Mo 02.02.09 18:51
Du kannst einfach einige Pixel vertikal nach oben verschieben. Ohne Antialiasing erhöhst du dadurch nicht nie Anzahl der gefärbten Pixel (wohl aber deren Abstand)
@Thread: Kennst du (Bezièr-)Splines? Einfach nen Kontrollpunkt hinzufügen und schwupps haste ne Beule drin 
|
|
Tilo
      
Beiträge: 1098
Erhaltene Danke: 13
Win7 geg. WInXP oder sogar Win98
Rad2007
|
Verfasst: Mo 02.02.09 19:19
Wie wäre es mit der ersten Hälfte der Sinus-Funktion?
Für die Punkte die verschoben werden sollen kannst Du die Verschiebung mit einer Sinusfunktion berechnen. Für eine genaue Formel fehlt mir aber jetzt erstmal die Zeit. Habe am Mittwoch "Verteidigung" der Seminararbeit.
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mo 02.02.09 19:25
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
Calculon
      
Beiträge: 676
Win XP Professional
Delphi 7 PE, Delphi 3 PRO
|
Verfasst: Mo 02.02.09 19:34
BenBE hat folgendes geschrieben : | (..)Alternativ krümmt man einfach den Raum (..) |
Also der Delphi-Roadmap nach, geht das erst ab Delphi 2013 (Codename: Bullshit)...
Gruß
--
_________________ Hallo Mutti
|
|
Hidden
      
Beiträge: 2242
Erhaltene Danke: 55
Win10
VS Code, Delphi 2010 Prof.
|
Verfasst: Mo 02.02.09 20:40
Hi
Wie stellst du dir das mit der Beule denn genau vor? Ich denke am kürzesten ist es wohl, wenn du ein bisschen über den Anwendungszweck sagst, es gibt da nämlich noch ein paar offene Fragen.
Mit dem Sinus würde das so funktionieren, dass du dir ein Intervall nimmst(erstmal eine gerade, horinzontale Linie). Sagen wir die Beule soll auf einer 100 Pixel breiten Bitmap* von 45 bis 75 gehen. Dann müsstest du jeden Punkt aus diesem Intervall um einen Sinus-Wert nach oben verschieben:
Quelltext 1: 2: 3:
| g(x) := x in [45..75]: f(x) + a * sin(pi * (x - 45) / (75 - 45)); sonst : f(x); a: Höhe der Beule |
Der Sinus wird also um pi * (75 - 45) gestreckt, sodass 30 nun die zweite Nullstelle(normalerweise pi) ist. Anschließend noch um 45 nach rechts verschoben, sodass unsere Beule an die richtige Stelle wandert.
[*1]: Ich merke gerade: du hast ja ein Array of TPoint statt einer Bitmap. Die Anwendung sollte sich aber abgesehen von einer Schleife, die herausfindet, welche Punkte auf dem Intervall liegen, nicht unterscheiden.
E: Willst du die Beule jetzt schräg ansetzen, musst du die Gerade vorher mit Sin(w) und Cos(w) rotieren, dann deine Rechenoperation durchführen und anschließend wieder die Drehung Rückgängig machen(Sin(-w), Cos(-w)). Eventuell musst du, wenn du einfach an der Stelle i eine Beule in den Graphen machen willst, vorher noch die Tangente, bzw. Steigung im Punkt i berechnen. Damit kommst du dann an diesen Winkel(  ArcTan())
mfG,
_________________ Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
|
|
jfheins
      
Beiträge: 918
Erhaltene Danke: 158
Win 10
VS 2013, VS2015
|
Verfasst: Mo 02.02.09 21:25
Man kann auch - falls es vielleicht nicht mehr sinusförmige Beulen sein sollen - kubische Splines nehmen (wiederhole ich mich?  )
http://en.wikipedia.org/wiki/Bézier_curve 
|
|
Clemens L. 
      
Beiträge: 158
Win Xp SP3
D6 Enterprise, Turbo Delphi Explorer
|
Verfasst: Di 03.02.09 16:26
Danke für die Vorschläge bisher
Schaue mir jetzt mal die Kubischen Splines genauer an, da findet sich ja doch recht viel in den Weiten des Internets!
_________________ Gruß, Clemens
Vor dem 27.04.08 als "hackerTreff" bekannt!
|
|