#1
  1. No Profile Picture
    Registered User
    Devshed Newbie (0 - 499 posts)

    Join Date
    Dec 2012
    Posts
    5
    Rep Power
    0

    Help coding a bitmap coordinates counter


    hello. My name is Thomas. Happy to stumble onto this forum. I need some help! I am using imagemagick to draw pictures and perform iterative operations on images. my latest idea requires some technical know-how that i just don't possess.

    To explain, I need a sort of complex(for me) counting program.

    Imagine an image of 1111x1111 pixels. I want to draw from the center outward spirally. pixel by pixel. I dont want to type in every X,Y coordinate. so i'm looking for a ?nested for loop? in C that can count the way i want. like this (sticking with X axis numbers first)

    555,556,556,555,554,554,554,555,556,557,557,557,557,556,555,554,553,553,553,553,553,554,555,556,557, 558,558,558,558,558,558,557,556,555,554,553,552,552,552,552,552,552,552 etc. (hope that's enough contextual information.)

    once i see how to code it in C. I can take care of the Y axis myself. and i think i should be off and running, using actionaz for help to move numbers around. Really hope someone can spare some moments to help me with this.

    Best wishes to you all.
    Thomas

  2. #2
  3. Contributed User
    Devshed Specialist (4000 - 4499 posts)

    Join Date
    Jun 2005
    Posts
    4,406
    Rep Power
    1871
    Consider the following image


    The things I notice are
    1. Up and left always have the same count
    2. Down and right always have the same count
    3. The count is 1,2,3
    So I imagine some pseudocode looking like this
    Code:
    int direction = -1   // -1 for up/left, +1 for down/right
    int x = 555, y = 555
    for ( count = 1 ; count < n ; count++ ) 
        draw(&x,&y,0,direction,count);  // up/down
        draw(&x,&y,direction,0,count);  // left/right
        direction = direction * -1;
    Where draw() is like
    draw ( int *xpos, int *ypos, int xdir, int ydir, int count );
    Attached Images
    If you dance barefoot on the broken glass of undefined behaviour, you've got to expect the occasional cut.
    If at first you don't succeed, try writing your phone number on the exam paper
  4. #3
  5. No Profile Picture
    Registered User
    Devshed Newbie (0 - 499 posts)

    Join Date
    Dec 2012
    Posts
    5
    Rep Power
    0
    Salem, thanks for your observation and code ideas!

    the math program loop that i imagined happening, is beneath. and I need each calculation result printed.

    555(starting number)
    LOOP START
    add 1
    multiply by 1
    subtract 1
    subtract 1
    multiply by 1
    multiply by 1
    LOOP END

    !!each new run through the loop must perform 2 more of each step!!

    example:

    second run
    add 1(3x) multiply by 1(3x) subtract 1(4x) multiply by 1(4x)

    third run
    add 1(5x) multiply by 1(5x) subtract 1(6x) multiply by 1(6x)

    fourth run
    add 1(7x) multiply by 1(7x) subtract 1(8x) multiply by 1(8x)

    of course multiply by 1 could be simply add 0 just thought using all ones was pretty.



    Originally Posted by salem
    Consider the following image


    The things I notice are
    1. Up and left always have the same count
    2. Down and right always have the same count
    3. The count is 1,2,3
    So I imagine some pseudocode looking like this
    Code:
    int direction = -1   // -1 for up/left, +1 for down/right
    int x = 555, y = 555
    for ( count = 1 ; count < n ; count++ ) 
        draw(&x,&y,0,direction,count);  // up/down
        draw(&x,&y,direction,0,count);  // left/right
        direction = direction * -1;
    Where draw() is like
    draw ( int *xpos, int *ypos, int xdir, int ydir, int count );
  6. #4
  7. Contributed User
    Devshed Specialist (4000 - 4499 posts)

    Join Date
    Jun 2005
    Posts
    4,406
    Rep Power
    1871
    So in terms of my pretty picture, the following actions would apply on the following colours?

    add 1 => yellow
    multiply by 1 => green
    subtract 1 => cyan
    subtract 1 => cyan
    multiply by 1 => blue
    multiply by 1 => blue


    Perhaps you could do
    Code:
    for ( count = 1 ; count < n ; count += 2 ) {
        draw(&x,&y,0,-1,count,OP1);  // up
        draw(&x,&y,-1,0,count,OP2);  // left
        draw(&x,&y,0,+1,count+1,OP3);  // down
        draw(&x,&y,+1,0,count+1,OP4);  // right
    }
    OPx could be anything to help you decide what to do within the draw function.
    Last edited by salem; December 24th, 2012 at 07:59 AM.
    If you dance barefoot on the broken glass of undefined behaviour, you've got to expect the occasional cut.
    If at first you don't succeed, try writing your phone number on the exam paper
  8. #5
  9. No Profile Picture
    Registered User
    Devshed Newbie (0 - 499 posts)

    Join Date
    Dec 2012
    Posts
    5
    Rep Power
    0
    I'm really struggling finding any information about the draw function in C. I'm performing the actual drawing in a program called imagemagick. And had just thought of using C to make a counter for coordinates.
  10. #6
  11. Contributed User
    Devshed Specialist (4000 - 4499 posts)

    Join Date
    Jun 2005
    Posts
    4,406
    Rep Power
    1871
    Some links
    http://www.imagemagick.org/script/magick-wand.php
    http://www.imagemagick.org/script/magick-core.php
    C doesn't do graphics, or drawing (or networking or ....) without the support of external libraries.

    Whilst this may seem a burden at first, it is useful to know that you're not going to be weighed down with the baggage of what someone else thinks is a good graphics API. You're always free to either do it yourself, or make a choice from all the libraries available.
    If you dance barefoot on the broken glass of undefined behaviour, you've got to expect the occasional cut.
    If at first you don't succeed, try writing your phone number on the exam paper
  12. #7
  13. No Profile Picture
    Registered User
    Devshed Newbie (0 - 499 posts)

    Join Date
    Dec 2012
    Posts
    5
    Rep Power
    0
    Salem thanks for sharing these. this is a great looking tool! I've lost so much time as it is struggling with making a seemingly simple math loop in C that I don't feel ready to tackle this. I've got a comfortable, easy way for me, using a bash script to draw my stuff with imagemagick. The real help i could use is just how to make that math LOOP posted about earlier in this thread. Thanks for so much help thus far.

    Thomas
  14. #8
  15. Contributed User
    Devshed Specialist (4000 - 4499 posts)

    Join Date
    Jun 2005
    Posts
    4,406
    Rep Power
    1871
    Consider this as a simple 'draw' function.
    Code:
    void draw(int *x, int *y, int dx, int dy, int count) {
      int i;
      for ( i = 0 ; i < count ; i++ ) {
        *x += dx;
        *y += dy;
        printf("X=%d, Y=%d\n", *x, *y );
      }
    }
    This will print out your coordinates.

    Now you can change the printf to automatically create your bash command line, say
    Code:
        printf("imagemagick image.bmp add %d %d 1\n", *x, *y );
    If you dance barefoot on the broken glass of undefined behaviour, you've got to expect the occasional cut.
    If at first you don't succeed, try writing your phone number on the exam paper
  16. #9
  17. No Profile Picture
    Registered User
    Devshed Newbie (0 - 499 posts)

    Join Date
    Dec 2012
    Posts
    5
    Rep Power
    0
    ok i need this in my life! how do i get this functionality in C? i'm not finding any way to get magickwand API which is what i'm assuming i need. please advise. this solution is very compelling.

    Originally Posted by salem
    Consider this as a simple 'draw' function.
    Code:
    void draw(int *x, int *y, int dx, int dy, int count) {
      int i;
      for ( i = 0 ; i < count ; i++ ) {
        *x += dx;
        *y += dy;
        printf("X=%d, Y=%d\n", *x, *y );
      }
    }
    This will print out your coordinates.

    Now you can change the printf to automatically create your bash command line, say
    Code:
        printf("imagemagick image.bmp add %d %d 1\n", *x, *y );
  18. #10
  19. Contributed User
    Devshed Specialist (4000 - 4499 posts)

    Join Date
    Jun 2005
    Posts
    4,406
    Rep Power
    1871
    Since you mentioned bash script, I assume you're on a Linux system with gcc as the compiler.

    Regarding MagickWand, have you tried to download the example wand.c program, compile it, and run it?

    If not, you should try it - if you want to progress beyond bash scripting. Just follow the instructions on the web page I posted earlier.

    If you get stuck with an error message, then post it here.
    If you dance barefoot on the broken glass of undefined behaviour, you've got to expect the occasional cut.
    If at first you don't succeed, try writing your phone number on the exam paper

IMN logo majestic logo threadwatch logo seochat tools logo