Bilder bestimmen

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
speedy
Beiträge: 4
Registriert: Fr 20. Jan 2017, 19:11

Bilder bestimmen

Beitrag von speedy »

Schönen guten Abend!
Ich habe eine Frage bzgl. meines Programmes.
Wie kann ich auf einem Bild dem Programm Flächen zuweisen?
Also ich möchte, dass ich auf einem Bild mehrere Flächen andrücken kann, und das Programm dann weiß, welche Fläche ich gedrückt habe.
Und mit dieser Fläche soll es dann eben weiterarbeiten.
MfG

creed steiger
Beiträge: 957
Registriert: Mo 11. Sep 2006, 22:56

Re: Bilder bestimmen

Beitrag von creed steiger »

Schönen guten Abend!

du musst deines Programms im Bild die Flächen zuweisen, ganz einfach
indem du beim Bild andrücken mehrere Flächen,welche Bilder gedrückt sind.
Mit dieser Bild Drück Flächen soll kannst du einfach weiterarbeiten.

Code: Alles auswählen

 
function drückflächebild (bildrückflache:flächedrückprogramm,flächedrückbild:drückflächeprogramflächedrück);
 




(die Bots werden auch immer schlechter)

Mathias
Beiträge: 6167
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Bilder bestimmen

Beitrag von Mathias »

(die Bots werden auch immer schlechter)

Ich denke eher, dies ist jemand der nicht richtig deutsch kann. :mrgreen:

Vielleicht meint er einfach so etwas in dieser Art:

Code: Alles auswählen

  Canvas.LineTo(Mouse.CursorPos.x, Mouse.CursorPos.y);
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

speedy
Beiträge: 4
Registriert: Fr 20. Jan 2017, 19:11

Re: Bilder bestimmen

Beitrag von speedy »

Mathias hat geschrieben:
(die Bots werden auch immer schlechter)

Ich denke eher, dies ist jemand der nicht richtig deutsch kann. :mrgreen:

Vielleicht meint er einfach so etwas in dieser Art:

Code: Alles auswählen

  Canvas.LineTo(Mouse.CursorPos.x, Mouse.CursorPos.y);


Und woher nehme ich die Position?
Und wie sage ich dann dem Programm, was die Fläche für einen Wert hat und was es damit machen soll?

Mathias
Beiträge: 6167
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Bilder bestimmen

Beitrag von Mathias »

Was willst du genau machen, das Bild wie ein Schachbrett aufzuteilen ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

speedy
Beiträge: 4
Registriert: Fr 20. Jan 2017, 19:11

Re: Bilder bestimmen

Beitrag von speedy »

Mathias hat geschrieben:Was willst du genau machen, das Bild wie ein Schachbrett aufzuteilen ?


Wie eine Wurfscheibe
Und da soll man die Fläche andrücken, welche man getroffen hat

Mathias
Beiträge: 6167
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Bilder bestimmen

Beitrag von Mathias »

Sind die Flächen rechteckig, oder sind diese Rund ?
Wen sie nicht Rechteckig sind, steht dir eine grosse Rechnerei vor.

Dies könnte dir weiter helfen, die Mausposition zu ermitteln.

Code: Alles auswählen

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: integer);
begin
  if ssLeft in Shift then begin
    Canvas.LineTo(x, y);
  end;
end;
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

speedy
Beiträge: 4
Registriert: Fr 20. Jan 2017, 19:11

Re: Bilder bestimmen

Beitrag von speedy »

Mathias hat geschrieben:Sind die Flächen rechteckig, oder sind diese Rund ?
Wen sie nicht Rechteckig sind, steht dir eine grosse Rechnerei vor.

Dies könnte dir weiter helfen, die Mausposition zu ermitteln.

Code: Alles auswählen

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: integer);
begin
  if ssLeft in Shift then begin
    Canvas.LineTo(x, y);
  end;
end;



sind sie leider nicht

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Bilder bestimmen

Beitrag von m.fuchs »

Holzhammermethode: Du machst dir ein zweites Bild, in welchem du jedes Feld in einer anderen Farbe einfärbst. Das lädst du dann unsichtbar in dein Programm. Klickt ein User auf das eigentlich Bild, schnappst du dir die Mauskoordinaten. Dann prüfst du welche Farbe der Pixel an den gleichen Koordinaten im versteckten Bild hat.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

u-boot
Beiträge: 306
Registriert: Do 9. Apr 2009, 10:10
OS, Lazarus, FPC: Ubuntu 9.10 (L 0.9.28 FPC 2.2.4)
CPU-Target: 32Bit
Wohnort: 785..

Re: Bilder bestimmen

Beitrag von u-boot »

.oO :shock:
m.fuchs hat geschrieben:Holzhammermethode: Du machst dir ein zweites Bild, in welchem du jedes Feld in einer anderen Farbe einfärbst. Das lädst du dann unsichtbar in dein Programm. Klickt ein User auf das eigentlich Bild, schnappst du dir die Mauskoordinaten. Dann prüfst du welche Farbe der Pixel an den gleichen Koordinaten im versteckten Bild hat.

Ich denk kreisrund wäre die Sache noch nicht wirklich schwierig, mit der Rechnerei. Für Segmente einer Dartscheibe wäre das ganze wohl schon etwas aufwändig.....
Ubuntu 9.10 (L 0.9.28 FPC 2.4.x)

Timm Thaler
Beiträge: 1224
Registriert: So 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
CPU-Target: Raspberry Pi 3

Re: Bilder bestimmen

Beitrag von Timm Thaler »

u-boot hat geschrieben:Ich denk kreisrund wäre die Sache noch nicht wirklich schwierig, mit der Rechnerei. Für Segmente einer Dartscheibe wäre das ganze wohl schon etwas aufwändig.....

Eigentlich nicht. Die x-y-Koordinaten der Maus in Polarkoordinaten umrechnen und dann per Radius und Winkel selektieren. Ein Zuordnung durch Array (elegant) oder if-then (Holzhammer) muss eh erfolgen, weil die Werte auf der Dartscheibe ja "willkürlich" verteilt sind und man auch noch Sonderfälle wie Bullseye und Double, Triple beachten muss.

Andererseits, es gibt doch Dartscheiben mit Kontakten. Die kann man mit einem Arduino abfragen und per RS232 an den Computer senden. ;-)

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Bilder bestimmen

Beitrag von wp_xyz »

Hey, u-boot, da hast du wohl in der Mathematik gefehlt?

Siehe dazu https://de.wikipedia.org/wiki/Datei:Dar ... sungen.svg

  • Zuerst den Abstand des Auftreffpunkts von der Mitte der Dartscheibe berechnen.
  • Mit den Radien der Ringe "Bull's eye", "Bull", "Triple ring" und "Double ring" vergleichen
  • Dann den Winkel zwischen x-Achse und der Verbindungslinie Mitte-Auftreffpunkt berechnen.
  • Die Dartscheibe hat 20 gleiche "Kuchenstücke", jedes spannt einen Winkel von 360/20 = 18° auf.
  • Damit weiß man, in welchem "Kuchenstück" der Pfeil gelandet ist (die Verdrehung um 1/2 Kuchenstück ist noch zu berücksichtigen)

Ungetestet:

Code: Alles auswählen

type
  TRing = (rBullsEye, rBull, rTripleInner, rTripleOuter, rDoubleInner, rDoubleOuter);
 
const
  Radius: array[TRing] of Double = (
    12.7/2,  // Bull's Eye
    31.8/2,  // Bull
    99/2,     // Triple Ring, innen
    107/2,   // TripleRing, außen
    162/2,   // Double Ring, innen
    170/2    // Double Ring, außen
  );
  SegmentPoints: array[0..19] of Integer = (20, 1, 18, 4, 13, 6, 10, 15, 2, 17, 3, 19, 7, 16, 8, 11, 14, 9, 12, 5);
  BullsEyePoints = 50;
  BullPoints = 25;
  SegmentAngle = 360/20;
 
function DartPoints(x, y: Double): Integer;
var
  angle: Double;
  r: Double;
  segment: Integer;
begin
  r := sqrt(x*x + y*y);
  if r < Radius(rBullsEye) then
    Result := BullsEyePoints
  else if r < Radius(rBull) then
    Result := BullsPoints
  else begin
    angle := -arctan2(y, x) / pi * 180 + 90 + SegmentAngle/2;
    // -, damit der Winkel im Uhrzeigersinn läuft
    // +90 + SegmentAngle/2, damit der Winkel am linken Rand des 20-Punkte Segments beginnt
    if angle < 0 then angle := angle + 360;
    segment := angle mod SegmentAngle;
    Result := SegmentPoints[segment];
    if (r >= Radius(rTripleInner)) and (r <= Radius(rTripleOuter) then
      Result := Result * 3
    else
    if (r >= Radius(rDoubleInner)) and (r <= Radius(rDoubleOuter) then
      Result := Result * 2
    else if (r > Radius(rDoubleOuter) then
      Result := 0;
  end;
end;

Antworten