Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[c#]GetPixel en ophogen van Point.Y

Pagina: 1
Acties:

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 20-11 23:37
In navolging op Midden Circel vinden (VB 6) ben ik ook eens aan de slag gegaan.

Vaste gegevens om correcte testwaardes te krijgen
Radius Cirkel: 180px;
Spotpoint x en y: 40

C#:
1
2
3
Point startpoint = spotpoint; //spotpoint(40,40)
Bitmap newcircle = new Bitmap(pictureBox1.Image);
Color srccolor = newcircle.GetPixel(startpoint.X, startpoint.Y);


Het vinden van de lengte van de X-as gaat me perfect af middels volgende code:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
while (newcircle.GetPixel(startpoint.X, startpoint.Y)==srccolor)
{
    startpoint.X--;
}
int colorChangeXStart = startpoint.X + 1; //save point! > geeft 20
                
startpoint = spotpoint; //reset startpoint
while (newcircle.GetPixel(startpoint.X, startpoint.Y) == srccolor)
{
    startpoint.X++;
}
int colorChangeXend = startpoint.X; //save point geeft 180

Om nu de lengte uit te rekenen trekken we colorChangeXStart van colorChangeXend af wat dus 160 is. Uiteraard heb ik Photoshop erbij gepakt om het na te meten. Dat klopt perfect.

Nu gaan we Y uitrekenen. Even simpel copy/paste gedaan van de X berekening.
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
startpoint = spotpoint;//reset startpoint

while (newcircle.GetPixel(startpoint.X, startpoint.Y)==srccolor)
{
    startpoint.Y--;
}
int colorChangeYStart = startpoint.Y + 1; //save point! > geeft 20, en klopt ook!

startpoint = spotpoint; //reset startpoint
while (newcircle.GetPixel(startpoint.X, startpoint.Y) == srccolor)
{
    startpoint.Y++;
}
int colorChangeYend = startpoint.Y; //hier gaat het dus fout. Geeft 41!

Bij het uitrekenen van de Y wordt er na de 1e iteratie al uit de while loop gesprongen. startpoint(40,41). Dit verwacht ik niet en hier heb ik geen verklaring voor.

Wie wel?

Heart..pumps blood.Has nothing to do with emotion! Bored


  • RambOe
  • Registratie: Februari 2003
  • Laatst online: 20-11 07:50
int colorChangeYend = startpoint.Y - 1;

Of bekijk ik het verkeerd

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 20-11 23:37
Dat verklaart toch niet dat er na 1 iteratie uit de loop gesprongen wordt. Of ik moet echt helemaal fout zitten.

edit
* TeeDee gaat maar weer terug in z'n hoek zitten.

Om het e.e.a. te testen heb ik ook het volgende staan:
C#:
1
2
3
4
5
6
            Bitmap myImage = new Bitmap(200,200,PixelFormat.Format24bppRgb);
            Pen p = new Pen(Color.Black,1);
            Graphics g = Graphics.FromImage(pictureBox1.Image);
            g.InterpolationMode = InterpolationMode.HighQualityBilinear;
            SolidBrush br = new SolidBrush(Color.Black);
            g.FillEllipse(br, new Rectangle(spotpoint, new Size(2, 2)));

Als Y nu 1 pixel opschuift kom je een zwarte pixel tegen. Zwart != Rood.

Stom stom stom...

[ Voor 71% gewijzigd door TeeDee op 16-01-2008 21:06 ]

Heart..pumps blood.Has nothing to do with emotion! Bored


  • cspare
  • Registratie: Oktober 2006
  • Laatst online: 29-07 22:19

cspare

What the deuce?!

Code ziet er geloof ik wel goed uit.
Wat is de waarde dan van newcircle.GetPixel(40,41), wijkt die daadwerkelijk af van srccolor?

The one who says it cannot be done, should never interrupt the one who is doing it.


  • ZpAz
  • Registratie: September 2005
  • Laatst online: 10:58
Geen idee of je hier wat aan hebt, maar ik heb het dus zo aangepakt (wel VB code dus :) )

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
Public Sub calcCenter(x As Integer, y As Integer)

topLeft = x
    
    'calc the center, first find the right
    go = True
        
    Do
        pos = main.pic.Point(x + jump, y)
        red = pos Mod 256
        
        If red > floorColor Then
            x = x + jump
        Else:
            go = False
        End If
    Loop While go = True
    topRight = x
    
    topMid = topRight - ((topRight - topLeft) / 2)
    
    topMidY = y
    
    'find the bottom
    go = True
    
    Do
        pos = main.pic.Point(x, y + jump)
        red = pos Mod 256
        
        If red > floorColor Then
            y = y + jump
        Else:
            go = False
        End If
    Loop While go = True
    bottomMid = y
        
    'now we know enough to calc the center
    mid = bottomMid - ((bottomMid - topMidY) / 2)
    main.pic.Circle (topMid, mid), 50, vbRed

end sub


De functie wordt dus aangeroepen met een x en y coordinaat uit de circel, aangezien het scanen van boven naar benenden van links naar rechts (per regel) gebeurt, hoef ik alleen maar naar rechts en naar onderen te gaan om de bodem en rechterpixel te vinden om het midden te kunnen berekenen.

[ Voor 15% gewijzigd door ZpAz op 16-01-2008 22:50 ]

Claude: "Domain patterns emerge from iteration, not generation." - Tweakers Time Machine Extension | Chrome : FF


  • Adion
  • Registratie: Januari 2001
  • Laatst online: 12:15
Heb je tijdens het debuggen al getest of of startPoint.X en startPoint.Y wel degelijk 40,41 zijn?
Als Point een object is, zal namelijk startpoint = spotpoint geen kopie maken, maar enkel de verwijzing aanpassen.

VirtualDJ 2024 - Fast Image Resizer - Instagram


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 20-11 23:37
Het is al opgelost.
In een andere method (welke sneaky ergens aangeroepen werd) werd een zwart 'vlekje' van 2x2px getekend op het spotpoint. Op deze manier was het logisch dat Y bij 40,41 een andere kleur tegenkwam.

Heart..pumps blood.Has nothing to do with emotion! Bored

Pagina: 1