rectangle distanz

Discussion in 'Tipps & Tricks' started by Cre3per, Dec 22, 2012.

  1. Cre3per

    Cre3per Addicted Member Inventar

    Joined:
    Oct 22, 2012
    Messages:
    697
    Likes Received:
    2
    Ich kann die Farbe und die größe von den rectanglen auswählen und sie zeichen. Ich will jetzt, dass wenn ein orangenes rectangle näher als 5 px an einem braunem dran ist, dass dann das braune auch orange wird. Wie mache ich das?
    Code:
    Imports System.IO
    Public Class Form1
        Dim Positions As String = "C:\Users\Lukas\Desktop\Positions.txt"
        Dim g As Graphics
        Dim BlockX As Integer = MousePosition.X
        Dim BlockY As Integer = MousePosition.Y
        Dim BlockW As Integer = 10
        Dim BlockH As Integer = 10
        Dim BFY As Integer
        Dim BFX As Integer
        Dim BlockKind As System.Drawing.Brush = Brushes.Brown
        Dim BlockColor As String = "Wood"
    
        Private Sub PictureBox1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBox1.Click
            DrawPicturebox()
    
            'Writes the rectangle positions into C:\Users\Lukas\Desktop\Positions.txt
            Dim SW As New StreamWriter(Positions, True)
            SW.WriteLine(BlockColor)
            SW.WriteLine(BlockX & "," & BlockY)
            SW.Close()
    
    
        End Sub
        Private Sub DrawPicturebox()
            'Ads a new rectangle
            g = Me.PictureBox1.CreateGraphics
            g.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias
            g.FillRectangle(BlockKind, BlockX, BlockY, BlockW, BlockH)
            g.Dispose()
        End Sub
    
        Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
            'Gets mouse X and Y
            BlockX = MousePosition.X - Me.Location.X - 26
            BlockY = MousePosition.Y - Me.Location.Y - 50
    
            'Displays the mouse X and Y coordinates
            Label3.Text = "MouseX: " & BlockX
            Label4.Text = "MouseY: " & BlockY
    
            'sets the height and width of the rectangle
            BlockW = tbwidth.Text
            BlockH = tbheight.Text
    
            'Displays the block color
            lblColor.Text = "Color: " & BlockColor
    
        End Sub
    
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            'Sets the size of Form1
            Me.Height = 559
            Me.Width = 671
    
            'Sets the size and border of Picturebox1
            With Me.PictureBox1
                .BorderStyle = BorderStyle.Fixed3D
                .Width = 500
                .Height = 500
            End With
    
            'Clears C:\Users\Lukas\Desktop\Positions.txt
            Dim SW As New StreamWriter(Positions, False)
            SW.WriteLine("")
            SW.Close()
        End Sub
    
        Private Sub btnChooseWood_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnChooseWood.Click
            BlockKind = Brushes.Brown
            BlockColor = "Wood"
        End Sub
    
        Private Sub btnChooseFire_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnChooseFire.Click
            BlockKind = Brushes.Orange
            BlockColor = "Fire"
        End Sub
    End Class
    
     
  2. krusty

    krusty Addicted Member Inventar

    Joined:
    Sep 8, 2012
    Messages:
    175
    Likes Received:
    0
    Du solltest den quellcode wenigstens ein bisschen kommentieren.
    Da schwirren unbekannte Objektvriablen rum, was zum Teufel soll tbxwidth sein ?

    Du solltest dich entscheiden: lässt du die Variablen bei Button1, Label1, PictureBox1 ...
    ODER nennst du Sie um: lblWidth, lblHeight, btnBku, txtBla...
    Ich schäzt du has das Projekt kopiert und einfach erweitert.

    Aber zur Antword
    https://www.youtube.com/watch?v=AIXUgtNC4Kc

    Ich bekomme das Projekt nicht zum Laufen, google einfach mal, wie man den Abstand zwischen zwei Punkten berechnen.
    Das überträgst du dann auf deine Rechtecke.


    EDIT:
    ahh, jetzt funktionierts...
    Also, so kannst du das sowies nicht so gut machen, weil du keinen zugriaff auf die gezeichneten Rechtecke hast,
    du musst dir die Positionen der Rechtecke abspeichern um berechnen zu können, wie weit das nächste entfernt ist.
     
  3. Cre3per

    Cre3per Addicted Member Inventar

    Joined:
    Oct 22, 2012
    Messages:
    697
    Likes Received:
    2
    Meine Rechtecke sind aber ja keine Objekte mit gespeicherten koordinaten sonder sind punkte die platziert werden und dann einfach da sind.
     
  4. Cre3per

    Cre3per Addicted Member Inventar

    Joined:
    Oct 22, 2012
    Messages:
    697
    Likes Received:
    2
    Ok, abspeichern werde ich irgendwie hinbekommen, aber wenn ich auf eine position auf der schon ein rechteck ist ein anderes setzte dann ist das neue unter dem alten und somit unsichtbar
     
  5. krusty

    krusty Addicted Member Inventar

    Joined:
    Sep 8, 2012
    Messages:
    175
    Likes Received:
    0
    genau das ist das Problem ;D
    wenn du willst, machen wir das mal ordentlich.

    Die... unschöne Variante ist die folgende:

    Code:
    Wenn der Zeichnen Button geklickt wurde:
       Berechne einen 5 Pixel großen Rand um das zu zeichnende Rechteck,
       Durchlaufe diesen Rand Pixel für Pixel,
       Wenn ein Pixel orange ist:
               so zeichne rechteck braun
       sonst:
               zeichne rechteck normal
    
     
  6. Cre3per

    Cre3per Addicted Member Inventar

    Joined:
    Oct 22, 2012
    Messages:
    697
    Likes Received:
    2
    Ich habe den Code oben aktualisiert.
    Ich habe die Positions.txt die derzeit auf meinem Desktop liegt auch in den resourcen hinzugefügt. Wie kann ich auf sie zugreifen?
    Ich will den Inhalt von der Positions.txt in einer RichTextBox haben, aber da ich einen StreamWriter benutze kann ich nicht gleichzeitig einen StreamReader benutzen. Was kann ich da machen?
     
  7. krusty

    krusty Addicted Member Inventar

    Joined:
    Sep 8, 2012
    Messages:
    175
    Likes Received:
    0
    So ist das mit dem abspeichern nicht gemeint gewesen.
    Stell dir mal vor jedes Spiel würde so seine Elemente abspeichern, da wäre dein rechner bei nem Spiel wie WOW sehr schnell überfüllt.
    Außerdem ist das Schreiben und Lesen von der Festplatte seeeeeeehr viel Langsamer, als das Lesen vom Arbeitsspeicher.

    Ich meinte in einer Liste speichern, in vb.net gibts die List<TypeOf> Klasse, diese hat eine add und eine get Methode und man kann sie in einer forschleife wie ein Array iterieten.


    Auf ressourcen hat man sehr simpel zugriff:
    My.Ressource. irgendwas...
     
  8. krusty

    krusty Addicted Member Inventar

    Joined:
    Sep 8, 2012
    Messages:
    175
    Likes Received:
    0
    wie gesagt, wenn du Interesse hast, machen wir das mal ordentlich und ich helf dir dabei ;D
     
  9. Cre3per

    Cre3per Addicted Member Inventar

    Joined:
    Oct 22, 2012
    Messages:
    697
    Likes Received:
    2
    Ich melde mich bei Interresse, ich habe aber gestern mit C# angefangen, habe habe nicht vor, mich lange damit zu beschäftigen, weil ich nach den Ferien in der Schule mit Java anfange.
     
  1. This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
    By continuing to use this site, you are consenting to our use of cookies.