[java] selectable polylines

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Rein_stein
  • Registratie: Maart 2003
  • Laatst online: 18-08 18:40
Heren,

Ik ben een applicatie aan het ontwikkelen welke de voortgang van offshore olie & gas velden weergeeft. Een bepaald veld wordt op de volgende manier weergegeven:
Afbeeldingslocatie: http://dl.dropbox.com/u/6337440/FieldLayout.JPG

De zwarte en blauwe blokken zijn structures, de rode lijntjes zijn de gas/olie leidingen. De tekening is een autocad bestand, en ik kan dat CAD bestand als dxf inladen in java, om vervolgens de coordinaten van alle onderdelen te krijgen.

De bedoeling is dat alle objecten (flowlines, structures etc) clickable worden, dwz, zodra een object wordt geselecteerd, geeft een tabel de nodige informatie over die sectie weer. Ook moet de kleur van het object de status weer gaan geven.

Ik kan aan de hand van alle coordinaten uit het CAD bestand polylines maken mbv graphics2d. Hoe krijg ik echter een listener toegewezen aan ieder object? Voor shapes is er de 'contains' functie, waarmee je door een verzameling shapes kan itereren en vervolgens kan bepalen welke shape zich op punt x,y bevind. Dit gaat echter niet op voor polylines...

Acties:
  • 0 Henk 'm!

  • Rein_stein
  • Registratie: Maart 2003
  • Laatst online: 18-08 18:40
Oplossing al gevonden:

http://forums.sun.com/thr...orumID=20&threadID=663926

[ Voor 21% gewijzigd door Rein_stein op 26-04-2010 15:13 ]


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 01:47
Die oplossing werkt (ze construëren daar een vierkant van een vaste grootte en checken vervolgens welke lijn die snijdt), maar het nadeel van die methode is dat als je het vierkant te groot maakt, het niet mogelijk is om een lijn te selecteren die strak tussen andere lijnen in ligt, en als je 'm te klein maakt is het weer lastig om snel een lijn te selecteren waar niets anders in de buurt zit. Ook zorgt het gebruik van een vierkant (in plaats van een cirkel) ervoor dat je meer bereik over de diagonalen hebt dan horizontaal of verticaal.

Persoonlijk zou ik liever de dichtstbijzijnde lijn selecteren, door over alle lijnensegmenten te lopen en met Line2D.ptSegDist() de afstand tot het aangeklikte punt te bepalen. Je selecteert dan gewoon het dichtstbijzijnde lijnsegment, of niets als de afstand te groot wordt.

Als je héél veel elementen hebt die geselecteerd kunnen worden, dan heb je er waarschijnlijk een spatial index bij nodig, maar zolang je maar een paar duizend elementen (of veel minder, zoals in het plaatje) hebt, lijkt het me geen probleem om tegen elk element afzonderlijk te checken.

[ Voor 15% gewijzigd door Soultaker op 26-04-2010 15:45 ]


Acties:
  • 0 Henk 'm!

  • YopY
  • Registratie: September 2003
  • Laatst online: 13-07 01:14
^dat lijkt me een goeie oplossing. Een eventuele alternatieve oplossing is om een 2D array te genereren met de meest dichtsbijzijnde lijn, waarbij de indexen een X en Y coordinaat zijn. Zo hoef je die gegevens maar één keer te berekenen (over alle punten) en zal het programma sneller reageren op een klik (ten koste van geheugen, alhoewel ik zo niet weet hoeveel het scheelt. Denk niet eens zo veel, afhankelijk van de resolutie van die afbeelding en dergelijke).

Natuurlijk zal een volgende post van een slimme wiskundige komen die veel beter is.

Acties:
  • 0 Henk 'm!

  • Rein_stein
  • Registratie: Maart 2003
  • Laatst online: 18-08 18:40
De oplossing van Soultaker vind ik al aardig geniaal en is een aardige verbetering tov de link. Al blijf ik het raar vinden dat je geen selection listeners aan de objecten kan toewijzen.

Acties:
  • 0 Henk 'm!

  • YopY
  • Registratie: September 2003
  • Laatst online: 13-07 01:14
Sja, lijnen en hokjes zijn waarschijnlijk nooit bedoeld als UI elementen. Misschien zou je je eigen subclass van die lijnen e.d. kunnen maken waardoor je wel selection listeners kunt toevoegen (en de logica die daarachter zit natuurlijk).
Pagina: 1