Home Forums Chat Forum any coding bods around to help?

Viewing 40 posts - 41 through 80 (of 107 total)
  • any coding bods around to help?
  • aracer
    Free Member

    I installed processing to give it a try and it’s quite neat. Pretty much standard java to the level required for projects like this (actually I’m fairly sure what I wrote would compile as C or C++, it’s just standard C style stuff). Grahams pseudo code works fine.

    aracer
    Free Member

    …though as you’d expect with java sin and cos work in radians, but there is a handy TWO_PI constant.

    whatnobeer
    Free Member

    Appears to be not at all object orientated…

    I did some work with processing when I was at uni and it might as well be Java. It’s super easy to get up and running and start bashing code out while totally forgetting that you should be writing OO code. Because it’s essentially Java you can write classes and do everything that you would in Java, but if you don’t want to, you don’t need to.

    We used it to bash out some simple video game style game loops with simple physics engines we’d written, all pretty easy if you’ve got a little coding background already.

    How are you getting on OP? Did you manage to get your head around loops?

    makecoldplayhistory
    Free Member

    Yes and no, whatnobeer.

    Whilst I understand loops and their three variables, and an write a loops that displays grids and rows and columns, I can’t see how to get the formula into the loop.

    I know

    x = 110*cos(360/number of circles)+300
    y = 110*sin(360/number of circles)+300

    I have the incomplete code and know the formulas have to go in to the draw loop. That’s where I’m stuck. I’m in Thailand so went to bed, dreamt about being stuck on maths and am back at it now… waiting for a lightbulb moment! 🙁

    void setup () {
    size (600, 600);
    background (255, 255, 255);
    smooth ();
    ellipse (width/2, height/2, 200, 200); // the guide circle

    }

    void draw() {

    for (int x = ; x < ; x ) {
    for (int y = ; y < ; y ) {

    ellipse (x , y , 20, 20);
    }
    }
    }

    Am I going to need several loops

    One loop for two circles, one for 3 and so on to 10?

    Graham. In your pseudo code, you wrote

    Constant AnglePerCircle = (360/NumCircles)

    How does that figure into the loops?

    Thanks for any help / pointers

    makecoldplayhistory
    Free Member

    I have got this far.

    int x, y;
    void setup () {
    size (600, 600);
    background (255, 255, 255);
    smooth ();
    //ellipse (width/2, height/2, 200, 200); // the guide circle.

    }

    void draw() {

    for (int x = 110*Math.cos(180)+300; x <= 2; x ++) {
    for (int y = 110*Math.sin(180)+300; y < 2; y ++) {

    ellipse (x*2, y*2, 20, 20);

    }
    }
    }

    I get the error message cannot convert from double to int.

    Am I along the right lines?

    whatnobeer
    Free Member

    Am I going to need several loops

    One loop for two circles, one for 3 and so on to 10?

    No, one loop should do it. It should loop from 1 to n, where n is the number of circles you want to draw. Inside the loop you want to have a method that can calculate the position of the circle and draw it. You’ll probably want a couple of helper methods to calculate the x and y coordinates of the circle you’re drawing. Something like:

    int numCircles = …
    float anglePerCircle = (360/NumCircles)

    for i while i < numCirles
    calculateXPos
    calculateyPos
    drawCirle

    Edit: be careful you supply the inputs to the sin and cos functions the right way. They expect radians. Have a look at the processing reference for conversion methods

    makecoldplayhistory
    Free Member

    Thanks whatnobeer.

    Will

    int numCircles = …
    float anglePerCircle = (360/NumCircles)

    be at the top of the code, above void setup?

    Here is my (not-even-close-to-working) code. The problem I have is there are so many bits I don’t get, I don’t know where to begin. It’s also holding me back as there are lots of small edits I need to make once I have this code written and then talk about the effects.

    int NumCircles = 2;
    float anglePerCircle = (360/NumCircles);
    int x, y;
    void setup () {
    size (600, 600);
    background (255, 255, 255);
    smooth ();
    //ellipse (width/2, height/2, 200, 200); // the guide circle.
    }

    void draw() {

    for (int x = 110*Math.cos (36)+300; x = 360; x ++) {
    for (int y = 110*Math.sin (36)+300; y = 10; y ++) {

    ellipse (x, y, 20, 20);
    }
    }
    }

    I (successfully) wrote other code last night to answer another question and understand it.

    I’ve been wondering if I can use similar code to complete this task. Creating images of each particular circle. I get why I should be using FOR loops but can’t seem to understand how to use them in this case. I’ve read everything I can find.

    I managed to write the code below by getting something to work and then adjusting it so it worked correctly. With this FOR loop, I haven’t got any where near it working so can’t begin to improve it.

    PImage imgone;
    PImage imgtwo;
    int value = 0;
    void setup () {
    size (1000, 480);
    imgone=loadImage (“vase1.jpg”);
    imgtwo=loadImage (“vase2.jpg”);
    }

    void draw () {
    if (value == 0) {
    background(0, 0, 0);
    image(imgone, 0, 0);

    } else if (value == 1) {
    background(255, 255, 255);
    image(imgtwo, 0, 0);
    }
    }

    void mousePressed() {
    value = value + 1;
    if (value > 1) {
    value = 0;
    }
    }

    Thanks for your help. It’s very much appreciated whatnobeer.

    edit:

    I see I have to loop on a circle counter and not the co-ords. Can’t see how that happens either though.

    Something like

    for (int circleNo = 0; circleNo < MaxCircles; circleNo ++)

    Where do I implement the co-ords (written in pseudo code by Graham) into the code?

    Mike

    whatnobeer
    Free Member

    I would step back and work out exactly what needs to be done at each step to get where you need. Write out method stubs and fill them in later. For example, to draw a circle you need the x and y coordinates. How do you get them? Write a method to calculate them.

    Think about what the position of the coordinates depends on and then pass those in to the method.

    The loop in your edit looks ok, what do you think you should be doing in there?

    I need to head off now, but try thinking it through step by step and sorting each little bit individually. I know how it feels to struggle with code at the last minute and it’s not fun. But they only way you’ll sort it is one step at a time.

    makecoldplayhistory
    Free Member

    Thanks whatnobeer (and others). I stepped back. I’ve written what I need to do in natural language. Tried and tried and read about and watch examples of the use of FOR loops but can’t get it right.

    I’ve had to give up on the FOR loop. I just couldn’t do it.

    I can use the loops for grids and rows etc but I can’t even begin to understand how to use them here. The bit that confuses me is where the formulas go and how they interact with the loop.

    If I use

    for (int circleNo = 0; circleNo < MaxCircles; circleNo ++)
    ellipse (x, y, 20, 20)

    then I think I understand that the next iteration of the loop will be

    for (int circleNo = 1; circleNo < MaxCircles; circleNo ++)
    ellipse (x, y, 20, 20)

    but I don’t see how the x and y will change?

    with the formulas, the variable is a.
    a = 360/n (where n is the number of circles around the circle)

    In pseudo code, in my mind, I need something that says

    for (int circleNo = 0; circleNo < MaxCircles; circleNo ++)
    ellipse (110*cos(CircleNo/360)+300, 110*sin(CircleNo/360)+300, 20, 20)

    The closest I got was

    int CircleNo = 0;
    int MaxCircles = 10;
    int MinCircles = 2;

    void setup () {
    size (600, 600);
    background (255, 255, 255);
    smooth ();
    //ellipse (width/2, height/2, 200, 200); // the guide circle.
    }

    void draw() {

    for (int i = 1; i < CircleNo; i = i+1) {
    for (int j = 0; j < 20; j = j+1) {
    // in the FOR loop, the first parameter “how does this variable start”,
    // then it defines what it wants to reach “when does it finish”,
    // third, how does the count variable update itself; here i = i+1 meaning i will add 1 to itself
    ellipse (i * 20, j * 20, 20, 20);
    // the ellipse will be drawn *20 on the x axis (i) and *20 on the y axis (j)
    }
    }
    }

    I understand no one’s here to do my work for me, but I’m not going to understand what goes where until I’ve seen it. Am I close enough for someone to get me to the finish line? Many thanks in case anyone does take pity on me!

    The code I have written, because an inelegant solution is better than nothing (eg. ducttape)

    int value = 0;
    void setup () {
    size (1000, 480);
    }

    void draw () {
    if (value == 0) {
    background(0, 0, 0);
    ellipse (300, 190, 20, 20);
    ellipse (300, 410, 20, 20); //2 circles show to begin
    } else if (value == 1) {
    background(0, 0, 0);
    ellipse (300, 190, 20, 20);
    ellipse (395, 355, 20, 20);
    ellipse (204, 355, 20, 20); //3 circles
    } else if (value == 2) {
    background (0, 0, 0);
    ellipse (300, 190, 20, 20);
    ellipse (410, 300, 20, 20);
    ellipse (300, 410, 20, 20);
    ellipse (190, 300, 20, 20); //4 circles
    } else if (value == 3) {
    background (0, 0, 0);
    ellipse (300, 190, 20, 20);
    ellipse (404, 266, 20, 20);
    ellipse (364, 388, 20, 20);
    ellipse (235, 388, 20, 20);
    ellipse (195, 271, 20, 20); //5 circles
    } else if (value == 4) {
    background (0, 0, 0);
    ellipse (300, 190, 20, 20);
    ellipse (395, 245, 20, 20);
    ellipse (395, 355, 20, 20);
    ellipse (300, 410, 20, 20);
    ellipse (204, 355, 20, 20);
    ellipse (204, 245, 20, 20); //6 circles
    } else if (value == 5) {
    background (0, 0, 0);
    ellipse (300, 190, 20, 20);
    ellipse (386, 231, 20, 20);
    ellipse (407, 324, 20, 20);
    ellipse (348, 399, 20, 20);
    ellipse (252, 399, 20, 20);
    ellipse (192, 324, 20, 20);
    ellipse (214, 231, 20, 20); //7 circles
    } else if (value == 6) {
    background (0, 0, 0);
    ellipse (300, 190, 20, 20);
    ellipse (378, 222, 20, 20);
    ellipse (410, 300, 20, 20);
    ellipse (378, 378, 20, 20);
    ellipse (300, 410, 20, 20);
    ellipse (222, 378, 20, 20);
    ellipse (190, 300, 20, 20);
    ellipse (222, 222, 20, 20);
    }
    }

    void mousePressed() {
    value = value + 1;

    if (value > 6) {
    value = 0;
    }
    }

    makecoldplayhistory
    Free Member

    Am I getting closer or further away from achieving it with loops? It’s still not even working enough for me to finish it off / improve it! 🙁

    Close enough for someone to finish it yet? Yes, I’m desperate!

    int i, j;
    int CircleNo = 0;
    int MaxCircles = 10;
    int MinCircles = 2;
    float x = (float)(110 * Cos(CircleNo/360 * Math.PI / 180F)) + 300;
    float y = (float)(110 * Sin(CircleNo/360 * Math.PI / 180F)) + 300;
    void setup () {
    size (600, 600);
    background (255, 255, 255);
    smooth ();

    }

    void draw() {

    for (int i = 1; i < CircleNo; i = i+1) {
    for (int j = 0; j < 20; j = j+1) {
    ellipse (i * 20, j * 20, 20, 20);
    }
    }
    }

    oldnpastit
    Full Member

    for (int i = 1; i < CircleNo; i = i+1) {

    You’ve set CircleNo to zero, so that won’t do anything.

    toys19
    Free Member

    I can’t comment on the coding but I’d wonder if rather than using the parametric equation of a circle couldn’t you do this with the pythagorean form which is simpler and more elegant? (is posted in the the link above)

    x^2 + y^2 = r^2

    makecoldplayhistory
    Free Member

    thanks oldnpastit. Changed that.

    The error I get is

    “the function Cos(double) does not exist”
    “the function Sin(double) does not exist”

    Like I said, the code’s so far away from being correct that I can’t see the errors in it!

    From 1 – 10, how close is the code from being correct, do you know?

    Thaks

    whatnobeer
    Free Member

    No idea if you’re still at it, but here goes.

    “the function Sin(double) does not exist”

    sin() – the method names are case sensitive and take floats, not doubles. You need to make sure your inputs are of the right type. You should either make sure they’re the correct type from the start or you could try and cast them into the right type (casting doubles to floats)

    From looking at the ducttape code, that’s what you need to do, but with a loop instead. You’ve hit the nail on the head when you said “but I don’t see how the x and y will change?” Obviously, with the code you wrote above that, they wont. You need to think about what the x and y actually are and how they change with respect to the circle you are drawing.

    float x = (float)(110 * Cos(CircleNo/360 * Math.PI / 180F)) + 300;

    I would scrap this and look at using the parametric equation as posted by toys. Or read this on how to calculate x and y on the circumference of a circle.

    One last hint: Each time you increment you’re loop, you draw a new circle in a new position (ie new x, y). That depends on how many circles you’ve already drawn. Hopefully you’ll see how you can write a method that works out the x and then the y based on how many circles in total you want and how any you’ve drawn already.

    Mackem
    Full Member

    Ditch the duct-tape code. You arent being tested on getting something that works, you are being tested on using the various programming elements – loops, methods, variables etc

    You’ll get more credit for trying these but getting it slightly wrong than the method you’ve employed.

    makecoldplayhistory
    Free Member

    whatnobeer – I’m not still at it. I couldn’t so used the code pasted below.

    This part of the course ha a lot about perception of motion etc. I needed to discuss how the circles (when shown one at a time), appear to be moving around the circle / coming up from the bottom etc.

    Mackem – I’ve submitted it now. Like I said, I needed to discuss the visual perceptions. In the commentry, I said,

    “Whilst I was aware that “If you are writing a lot of repetitive code, you should probably use loops”, I was unable to get the code to function correctly. I attempted to create a FOR loop, whereby n circles could be shown at the correct x, y co-ordinates.
    The codes’ purpose (see Code 7) was to loop on a circle counter eg.

    I believed this would provide the most elegant solution. With it not proving to be fruitful, I decided that an in-elegant solution (such as Code 5) is better than none!”

    I submitted my non-working code with loops so will hopefully get some marks for the correct approach. I have no idea if it was slightly wrong or infinite-monkey-infinite-typewriter-esque.

    Whatnobeer – I appreciate you weren’t going to do my work for me. Thanks for all of your help. If you have (another) few minutes, I’d love to see what the code should have looked like.

    My final code (which allowed me to comment on visual perception)

    int value = 0;
    void setup () {
    size (600, 600);
    }

    void draw () {
    if (value == 0) {
    background(0, 0, 0);
    ellipse (300, 190, 20, 20);
    ellipse (300, 410, 20, 20); //2 circles show to begin
    } else if (value == 1) {
    background(0, 0, 0);
    ellipse (300, 190, 20, 20);
    ellipse (395, 355, 20, 20);
    ellipse (204, 355, 20, 20); //3 circles
    } else if (value == 2) {
    background (0, 0, 0);
    ellipse (300, 190, 20, 20);
    ellipse (410, 300, 20, 20);
    ellipse (300, 410, 20, 20);
    ellipse (190, 300, 20, 20); //4 circles
    } else if (value == 3) {
    background (0, 0, 0);
    ellipse (300, 190, 20, 20);
    ellipse (404, 266, 20, 20);
    ellipse (364, 388, 20, 20);
    ellipse (235, 388, 20, 20);
    ellipse (195, 271, 20, 20); //5 circles
    } else if (value == 4) {
    background (0, 0, 0);
    ellipse (300, 190, 20, 20);
    ellipse (395, 245, 20, 20);
    ellipse (395, 355, 20, 20);
    ellipse (300, 410, 20, 20);
    ellipse (204, 355, 20, 20);
    ellipse (204, 245, 20, 20); //6 circles
    } else if (value == 5) {
    background (0, 0, 0);
    ellipse (300, 190, 20, 20);
    ellipse (386, 231, 20, 20);
    ellipse (407, 324, 20, 20);
    ellipse (348, 399, 20, 20);
    ellipse (252, 399, 20, 20);
    ellipse (192, 324, 20, 20);
    ellipse (214, 231, 20, 20); //7 circles
    } else if (value == 6) {
    background (0, 0, 0);
    ellipse (300, 190, 20, 20);
    ellipse (378, 222, 20, 20);
    ellipse (410, 300, 20, 20);
    ellipse (378, 378, 20, 20);
    ellipse (300, 410, 20, 20);
    ellipse (222, 378, 20, 20);
    ellipse (190, 300, 20, 20);
    ellipse (222, 222, 20, 20); //8 circles
    }
    }

    void mousePressed() {
    if (mouseButton == LEFT) {
    value = value + 1;
    } else if (mouseButton == RIGHT) {
    value = value – 1;
    }

    if (value > 6) {
    value = 0;
    }
    if (value < 0) {
    value = 6;
    }
    }

    llama
    Full Member

    jeeez what they teaching nowadays blah blah in my day etc etc etc

    makecoldplayhistory
    Free Member

    Ilama: I’ve never been taught anything about this by anyone.

    The only thing I have been told by the University is a reading list, an assignment deadline and an exam date. But, thanks for asking.

    toby1
    Full Member

    It’s one of those problems that now you aren’t under pressure to finish you can take the time to look at all the elements of what you wanted to do and come up with a better solution. It’ll help your ability to program in the future if you do.

    makecoldplayhistory
    Free Member

    Toby – I have the solution. I just can’t make it happen. I have found the code in another language. I simply can’t translate it into Processing.

    I can see how this could be easily adapted for my purpose.

    size(200,200);
    smooth();
    background(255);

    int nbr_circles = 24;

    float lg_diam = width * .85;
    float lg_rad = lg_diam / 2;
    float lg_circ = PI * lg_diam;

    float sm_diam = (lg_circ / nbr_circles);

    float cx = width/2.0;
    float cy = height/2.0;

    fill(0);
    for (int i = 1; i <= nbr_circles; ++i) {
    float angle = i * TWO_PI / nbr_circles;
    float x = cx + cos(angle) * lg_rad;
    float y = cy + sin(angle) * lg_rad;
    ellipse(x, y, sm_diam, sm_diam);
    }

    I’m sure you mean well, but it’s coming across as very patronising.

    chambord
    Full Member

    You needed to recalculate x and y inside the loop each time. If you look again at the pseudocode Graham posted on page 1 I’m sure you can do it. Here is some code which will draw a straight line of circles.

    void draw () {
      int x, y;  // Declared x and y circle coordinates
      int numIterations = 10;
      for (int i = 0; i < numIterations; i++) // for loop executes 10 times
      {                            // This is where the loop body starts, so
                                   // whatever  is in the brackets will be
                                   // run 10 times
        x = 10 * i;                // calculate x
        y = 20 * i;                // calculate y
        ellipse(x, y, 5, 5);       // draw ellipse
      }                            // Loop body ends
    }

    Note that x and y are recalculated inside the loop body each iteration and then used as parameters for the ellipse method (I.e. the newly calculated position of the circle is used to draw the circle, then on the next iteration we calculate the position again and redraw in a new position).

    makecoldplayhistory
    Free Member

    Thanks Chambourd. I’ll have a look at that when the rest of my assignments are finished.

    I’ve had Graham’s writing on a post-it in front of me all day.

    My issue is getting it to work in processing. I don’t think I’m writing the formulae in the correct format (syntax?).

    Thanks again for taking the time to help.

    Good luck in the PhD.

    lemonysam
    Free Member

    My issue is getting it to work in processing. I don’t think I’m writing the formulae in the correct format (syntax?).

    Do you realise if you right click the function you can find it in the reference?

    makecoldplayhistory
    Free Member

    lemonysam!!!

    I had no idea!

    Thank you!

    It’s little things like that that aren’t taught with distance learning and make it so much harder.

    makecoldplayhistory
    Free Member

    Chambourd – can I email you?

    Mike (makecoldplayhistory@gmail.com)

    oldnpastit
    Full Member

    Can you go to your supervisor and just explain that you’ve misread the dates and could you have an extra week?

    P.S.
    Have you drawn a picture of what you’re doing? If not, do so right now. On the picture mark all the distances and angles.

    aracer
    Free Member

    That is almost exactly the code you needed. Are you suggesting you can’t translate that into processing? Because that looks like java, and processing is java – all you need to do is take that code and rearrange it into the processing specific functions (setup() and draw()). No translation needed.

    The frustrating thing for us onlookers is that you got so close. You posted this before submitting I think:

    Is pretty much spot on – you just needed to replace the 360 with TWO_PI because sin and cos work in radians not degrees (oh and you need to watch your case – you have circleNo in the loop and CircleNo in the ellipse command). I think to some extent it’s a lack of confidence rather than a lack of understanding which is the problem – why didn’t you just try coding that, after fixing the case and adding a ; to the end of the ellipse function it should compile and work.

    Edit: actually there is a mistake in the angle formula – you need

    360 * circleNo / MaxCircles
    not
    circleNo / 360
    (obviously replace 360 with TWO_PI as above)

    aracer
    Free Member

    Neat, but not an easy formula to use to create points evenly spaced around a circle (off the top of my head I can’t think how to do that at all).

    makecoldplayhistory
    Free Member

    oldnpastit –
    It’s an online degree. I thought I’d save money and go through Goldsmiths as opposed to The OU.

    I don’t have a supervisor nor anyone to contact. There’s no online discussion board.

    I wasn’t exaggerating when I said you are sent a reading list, examination dates and an assignment. This assignment (plus 2 others) was set 6 weeks ago. Due on the 15th.

    I’ve got sketches (on several sheets of paper) from where I was working out the x,y co-ords manually.

    How will they help me if it’s being calculated inside Processing?

    Thanks

    aracer
    Free Member

    Sounds tough – the trouble is, everybody else on this thread is a coder, and it’s hard for us to understand why it’s difficult as we don’t remember not being able to code! Though you have been given some links to places you can discuss stuff – best bet is usually to search for something similar (though not always easy to know what to search for – don’t do it too much as you will irritate, but if you post a question which has been asked before usually somebody will link to a previous answer).

    Does your reading list include a basic tutorial on coding? If not you could do worse than something like this: http://www.amazon.co.uk/Beginning-Programming-Java-Dummies-Computers/dp/1118407814/ref=dp_ob_title_bk

    (as an experienced coder, when I want to learn something new I tend to google “NAME_OF_THING_I_WANT_TO LEARN tutorial”, which comes up with http://docs.oracle.com/javase/tutorial/ for java, though this might be a bit tough for you – though you could try https://www.google.co.uk/#q=coding+tutorial)

    I’ve got sketches (on several sheets of paper) from where I was working out the x,y co-ords manually.
    How will they help me if it’s being calculated inside Processing?

    All you need to do is understand how you were working out the co-ords manually and turn that into pseudo code, which you can then turn into processing/java. Is one of the fundamental skills of coding.

    GrahamS
    Full Member

    Didn’t realise this was still trundling along.

    OP: you REALLY need to get your head around basic flow-control (like for loops) and the ideas of assigning values to variable and calling functions.

    The syntax varies, but these core concepts are absolutely fundamental to programming in almost any language.

    Here is a basic for-loop in Java/Processing:

    for (int i = 1; i < 4; i++)
    {
      my_function(i);
    }

    The three clauses between the brackets work as follows:

    int i = 1;the initialiser. This sets up the variables you will use to control the loop. It is only executed once. In this case it declares an integer named “i” and initialises it to 1. So in the first iteration of the loop i will be 1.

    i < 4;the condition. This is tested BEFORE each iteration of the loop. The loop is only executed when this is true. If it is false then the loop is finished and the program continues on to the code after the loop. Here it checks that i is less than 4.

    i++the afterthought. This is executed AFTER each iteration of the loop. It will usually modify the value of a variable that is tested in the condition so that at some point the condition will be false. Here it just increments i by one.

    So… that bit of code will work like this:

    [list]

  • Initialiser: Declare i and set it to 1
  • Condition: Is i less than 4? Yes, okay carry on.
  • Body: Call my_function(1)
  • Afterthought: Increment i. i is now 2.
  • Condition: Is i less than 4? Yes, okay carry on.
  • Body: Call my_function(2)
  • Afterthought: Increment i. i is now 3.
  • Condition: Is i less than 4? Yes, okay carry on.
  • Body: Call my_function(3)
  • Afterthought: Increment i. i is now 4.
  • Condition: Is i less than 4? Nope, we’re done.
  • [/list]

Flaperon
Full Member

^^ Although convention is that you start with i = 0, so that the i < 4 limit will perform 4 iterations.

GrahamS
Full Member

Indeed, zero is typical, but I thought it was important for the OP to realise it doesn’t have to be zero.

(Especially if he doesn’t have to draw the case with zero circles 🙂 )

lemonysam
Free Member

I’ve got sketches (on several sheets of paper) from where I was working out the x,y co-ords manually.
How will they help me if it’s being calculated inside Processing?

One of the most fundamental skills in programming is working your way through your own thought processes and then turning that into a process you can write.

In this instance when you computed the positions for the circles by hand I’m imagining you went something like.

Ok, so I have to fit… lets say five… circles around the circumference of this circle so I guess that means they have to form 72 degree angles* with the centre of the middle circle and one another.

Ok, that’s easy so now I need to work out what the position is of the centre of the circles on the circumference of the circle where I’m starting – the first one’s easy enough, it’s straight up by the radius of the circle, but after that I need to use some trig. God I hate trig. Mr Wright at school had a stupid beard and smelt like chips, I could never really listen to him… Anyway, SOHCAHTOA and all that jazz.

ITERATION ONE (Let I = 1)
So the first one is going to be at 72 degrees to the first line, the radius of the circle will form the hypoteneuse of a triangle which will give me the coordinates to get from the middle of the circle to the centre of the new circle. Great. Erm… well the SOH part gives me opposite over hypoteneuse and the CAH part gives me the adjacent over the hypoteneuse so I’ll need one of each. That means that the centre of the new circle will be at:
x = CentreMainCircle + RadiusMainCircle * sin(72)
y = CentreMainCircle + RadiusMainCircle * cos(72)

So let’s assume that the radius is 10 and the centre is at (0,0), does that look right – the point is at (9.5, 3.1) looks about right to me. Ok, draw my circle there. Boom!

ITERATION TWO (I = 2)
OK on a roll now, what’s the new angle I need. Ok well it seems to be TWO times 72 degrees or 144 degrees. That gives me

x = 0 + 10 * sin(144) = 5.9
y = 0 + 10 * cos(144) = -8.1

Draw the circle at (5.9, -8.1). Looks good!

ITERATION THREE (I = 3)
Hmm… so now we’re using THREE times 72 (Hmmm… I*72?) or 216 degrees.
x = 0 + 10 * sin(216) = -5.9
y = 0 + 10 * cos(216) = -8.1

Hot damn I’m good.

ITERATION FOUR (I = 4)
So Let’s go straight for it.
x = 0 + 10 * sin(I * (360/NumberOfCircles)) = -9.5
y = 0 + 10 * cos(I * (360/NumberOfCircles)) = -3.1

Bosh, I AM INVINCIBLE!

Hmmm… If I do one more I reckon I wouldn’t have needed to work out the initial circle’s position first. sooooo…

ITERATION FIVE(I = NumberOfCircles )
x = 0 + 10 * sin(I * (360/NumberOfCircles)) = 0
y = 0 + 10 * cos(I * (360/NumberOfCircles)) = 10

Amazing, job done!

So then, generalising it.

1.) Well I took a number of circles
2.) I divided 360 by the number of circles
3.) I looped from I = 1 up to I = the number of circles doing:
x = 0 + 10 * sin(I * (360/NumberOfCircles))
and
y = 0 + 10 * cos(I * (360/NumberOfCircles))

to get pairs of coordinates
4.) I drew circles at each of those points.
5.) I danced around the room waving my hands in the air.*

sooo…
var n = NumberOfCircles
var Ox = CentreOfMainCircleX
var Oy = CentreOfMainCircleY
var r = RadiusMainCircle
var r2 = RadiusLittleCircle
for I=1 to I=n do
    var x = Ox + RadiusMainCircle * sin(I * (360/n))
    var y = Oy + RadiusMainCircle * cos(I * (360/n))
    elipse(x,y,r2,r2)
end for

Profit

This might seem patronising but it’s pretty much exactly how my brain will run through a problem like this and it serves me well enough to write code for a living. I’m sure I’ve made some trivial mistake in here but I hope it helps.

*6. Realise I should have done this in Radians

llama
Full Member

paste this into the editor. 0-50 circles adjusted with left and right arrow keys. It works.

int numberOfCircles = 10;

void setup() {
size (600, 600);
}

void draw() {
background (255, 255, 255);
ellipse(width/2, height/2, 200, 200);
float a = 360.0/numberOfCircles;
for (int i = 0; i < numberOfCircles; i++) {
float x = 210*cos((a*i) * PI / 180.0)+width/2;
float y = 210*sin((a*i) * PI / 180.0)+height/2;
ellipse(x, y, 20, 20);
}
}

void keyPressed() {
if (keyCode == LEFT) {
numberOfCircles = max(numberOfCircles – 1, 0);
}
if (keyCode == RIGHT) {
numberOfCircles = min(numberOfCircles + 1, 50);
}
}

makecoldplayhistory
Free Member

Thanks for the replies.

I teach English as a 2nd Language for a living. I know how hard it can be to dumb things down enough; especially when they seem so simple to you.

Lemony – that certainly seems like a sensible approach. I’ll try it with the next question!

With help from here, I got to

int nbr_circles = 8;
void setup() {
size(300,300);
smooth();
background(255);
}

void draw() {
background(255);
float cx = width/2.0;
float cy = height/2.0;
fill(0);
//float x, y;
for (int i = 0; i < nbr_circles; i++)
{

float angle = i * TWO_PI / nbr_circles;
float x = cx + 110.0 * cos(angle); // calculate x
float y = cy + 110.0 * sin(angle); // calculate y
ellipse(x, y, 20, 20);
}
}

void mousePressed() {
if (mouseButton == LEFT) {
nbr_circles = nbr_circles + 1;
} else if (mouseButton == RIGHT) {
if (nbr_circles > 2) {
nbr_circles = nbr_circles – 1;
}
}
}

AND… understand what it all does.

It wasn’t the idea of loops that I was struggling with, nor the formula, it was how it combines.

My brain, doesn’t work like a coder but as a human (no offence). I mean, when I saw the problem, I thought I would calculate the 54 circles for n=2 to n = 8 and then get the code to display it.

Thanks agian for all help.

lemonysam
Free Member

when I saw the problem, I thought I would calculate the 54 circles for n=2 to n = 8 and then get the code to display it.

aracer
Free Member

You understand about how to learn then – I don’t know why you’re finding this so difficult 😉

With help from here, I got to

some code

AND… understand what it all does.

Yay!!!

You haven’t got to the deadline yet have you? You can resubmit?

aracer
Free Member

lol @lemonysam, that explains exactly what happens when doing maintenance stuff with another chap I work with who is far less geeky than me. It is frustrating that sometimes writing the script takes almost as long as it would have taken to do it by hand, but experience suggests that most things get repeated more than once, so that the actual trade off point ends up fairly close to where I first decided a script was needed.

makecoldplayhistory
Free Member

I can’t re-submit the code. I’ve submitted that particular question.

However, the next question says ‘alter the code you have so that…”

I’ll be able to use the code in the next section. Also, this isn’t a coding module so much as perceptions of what’s happening on the screen. The majority of the marks are for your academic writing about what you see the code doing.

We do need an accompanying running commentary on writing the code. I don’t imagine I’ll lose many marks for the code from section 1 being improved by section 2.

Other code, I didn’t struggle with, was creating a square, offset in the window and rotating it about the centre of the window. You had to talk about how, as the frame rate increased, it became a circle on the screen. The code for this question was obviously a massive leap in complexity compared to

draw a square
make it rotate
right click mouse increases rotation speed
left click mouse decreases rotation speed

Thanks again for the replies.

Viewing 40 posts - 41 through 80 (of 107 total)

The topic ‘any coding bods around to help?’ is closed to new replies.

Spread the word:

Overview Chat Bike Members News Women