Autor Beitrag
Clemens L.
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 158

Win Xp SP3
D6 Enterprise, Turbo Delphi Explorer
BeitragVerfasst: Mo 02.02.09 18:00 
Hallo mal wieder, :)

ich habe ein kleines Problem. Ich habe eine Linie, die folgendermaßen vorliegt:

ausblenden 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 user profile iconNarses: 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 user profile iconNarses: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 676

Win XP Professional
Delphi 7 PE, Delphi 3 PRO
BeitragVerfasst: Mo 02.02.09 18:19 
user profile iconClemens L. hat folgendes geschrieben Zum zitierten Posting springen:
(..) 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. Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 158

Win Xp SP3
D6 Enterprise, Turbo Delphi Explorer
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8554
Erhaltene Danke: 481

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: 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. :gruebel:

_________________
Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
Calculon
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 676

Win XP Professional
Delphi 7 PE, Delphi 3 PRO
BeitragVerfasst: Mo 02.02.09 18:48 
user profile iconDude566 hat folgendes geschrieben Zum zitierten Posting springen:
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. :gruebel:

Für jeden Pixel, den du der Geraden entnimmst kannst du oberhalb bzw. unterhalb der Geraden einen Pixel hinzufügen, wobei das sehr schräg aussähe und nicht wie ein schöne runde Beule...

_________________
Hallo Mutti
GTA-Place
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 918
Erhaltene Danke: 158

Win 10
VS 2013, VS2015
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 1098
Erhaltene Danke: 13

Win7 geg. WInXP oder sogar Win98
Rad2007
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Mo 02.02.09 19:25 
user profile iconCalculon hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconClemens L. hat folgendes geschrieben Zum zitierten Posting springen:
(..) 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...


user profile iconGausi hat folgendes geschrieben Zum zitierten Posting springen:
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.


Alternativ krümmt man einfach den Raum ;-) Denn der kürzeste Weg in einem Schwerkraft-Feld ist eine Kurve ;-)

k, ansonsten wie user profile iconGausi schon sagte ;-)

_________________
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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 676

Win XP Professional
Delphi 7 PE, Delphi 3 PRO
BeitragVerfasst: Mo 02.02.09 19:34 
user profile iconBenBE hat folgendes geschrieben Zum zitierten Posting springen:
(..)Alternativ krümmt man einfach den Raum ;-) (..)

Also der Delphi-Roadmap nach, geht das erst ab Delphi 2013 (Codename: Bullshit)...

Gruß
--

_________________
Hallo Mutti
Hidden
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2242
Erhaltene Danke: 55

Win10
VS Code, Delphi 2010 Prof.
BeitragVerfasst: 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:
ausblenden 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( :arrow: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 918
Erhaltene Danke: 158

Win 10
VS 2013, VS2015
BeitragVerfasst: 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? :gruebel: ) ;)

http://en.wikipedia.org/wiki/Bézier_curve ;)
Clemens L. Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 158

Win Xp SP3
D6 Enterprise, Turbo Delphi Explorer
BeitragVerfasst: 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!