Вопрос

Jameson
Offline
Зарегистрирован: 21.03.2014
boolean [] button1;
boolean [] button2;
int i, n,u,k,j,h,ww,w;
float distTotal;
PFont verdana;
void setup() {


  size(700,500);
  button1 = new boolean[1];
   button2 = new boolean[1];
}

void draw() {


      fill(0);
      text(int(distTotal),140,65);
      
      
 if(button1[i]) 
   {  
    if (mousePressed==true) 
  {
    fill(255, 0, 0);
    rect(mouseX, mouseY, 5, 5);
    point(pmouseX, pmouseY);
    strokeWeight(1);
    if (w>0&&ww>0&&!keyPressed)
    {
      line(w, ww, mouseX, mouseY );
      distTotal = distTotal + (dist( w, ww, mouseX, mouseY )/50);
    }
    println(distTotal);
    w=mouseX;
    ww=mouseY;
  }
  fill(0,255,0);
           }
 else 
      {
         fill(255,255,0);
      }
      strokeWeight(3);
ellipse(100,100,45,45);


if(button2[u]) 
   {  
         float sum;
         int otv=0;
         sum=distTotal/6;
         println(sum);
         println(otv);
         if ( sum > otv)
         {
           for(otv=0;otv < sum;otv ++)
           {
         if(mousePressed==true)
         {
           ellipse(mouseX,mouseY,20,20);
         }
           }
   }
   }
 else 
      {
        fill(255,255,0);
      }
      strokeWeight(3);
ellipse(200,200,45,45);
  


}

void mouseClicked(){
    if(dist(100,100,mouseX, mouseY)<=25){
      button1[n] = !button1[n];
      button2[n] = false;
    }
    if(dist(200,200,mouseX, mouseY)<=25){
      button2[n] = !button2[n];
      button1[n] = false;
    }
}

В общем написал программку, это её часть, суть в том что я нарисовал линии (в перспективе план комнаты) и расчитав длинну стен получаю площадь, поделив площадь на 6 ( столько квадратов примерно нужно нужно на 1 ПК) я получаю число (условно 10)  дальше  я  рисую кружки ( условно пк) и  сделал ограничение что  if ( sum > otv) где otv=0 и с каждым поставленным пк значение otv должно увеличиваться на 1, но такового не происходит ((( Может кто-то знает в чем проблема?

Geronimo
Offline
Зарегистрирован: 06.05.2013

Вы используете переменные i n u в качестве индекса массивов но нигде не присваиваете им значения. Это так задумано?

Jameson
Offline
Зарегистрирован: 21.03.2014

Значение переменных не играет тут никакой роли, суть проблемы кроется тут >>>

if(button2[u]) 
   {  
         float sum;
         int otv=0;
         sum=distTotal/6;
         println(sum);
         println(otv);
         if ( sum > otv)
         {
           for(otv=0;otv < sum;otv ++)
           {
         if(mousePressed==true)
         {
           ellipse(mouseX,mouseY,20,20);
         }
           }
   }
   }
 else 
      {
        fill(255,255,0);
      }
      strokeWeight(3);
ellipse(200,200,45,45);
  

Тут цикл for не выполняет свою задачу тоесть не прибавляет значение +1 к переменной otv 

 

Geronimo
Offline
Зарегистрирован: 06.05.2013

А до него управление доходит?

 

 println(sum);
07

         println(otv);

что выводит?

Jameson
Offline
Зарегистрирован: 21.03.2014

println(sum); показывает длинну нарисованной линии

println(otv); значение переменной которое я ей присвоил то есть 0

Думаю что в цикл for входит т.к. под циклом действие ellipse(mouseX,mouseY,20,20); то есть рисование кругов по координатам с мышки , я пологаю что изменение переменной otv не происходит из-за того что ellipse(mouseX,mouseY,20,20); не считает его за действие то есть один  раз я в него зашел и  не  выходя из цикла рисую до посинения, думаю если бы я смог выйти с цикла то переменной otv точно бы присвоилось значение +1

 

leshak
Offline
Зарегистрирован: 29.09.2011

> значение otv должно увеличиваться на 1, но такового не происходит

А с чего вы взяли что оно "не увеличивается"? Как, по вашему, вы должны увидеть это увеличение? Если вы просто пробегаете otv от 0 до sum-1, нигде это otv не используя? Ни на рисование кружочков оно не вляется, ни println ему не деалется.

Вернее на количество кружочков оно вляется, но так как кружочки рисуются по одним и тем же координатам, то различить их невозможно. Все кружки кружки рисуются в одном месте. там где сейчас мышка. накладываясь один на другой.

И проверка

   if ( sum > otv)

абсолютно линяя. Она просто дублирует условия выхода из цикла 

for(otv=0;otv < sum;otv ++)

Это не считая того, что она в любом случае ВСЕГДА будет проходит. Если у вас нет комнат с нулевой или отрицательной площадью. sum, по хорошему, всегда положительное число. otv - всегда ноль. логично положительное число всегда больше нуля. и if(sum>otv) - всегда даст true.

leshak
Offline
Зарегистрирован: 29.09.2011

намек: есть сильное подозрение (не уверенность, потому как не совсем ясно что вы хотите сделать), что

1. otv вам нужно сделать глобальным, и увеличивать его на нажатие мышки)
2. А вот всякие i - как раз наоборот (вообще нужно сразу бить по рукам за объявление i глобальной).
3. otv у вас должно быть не индексом цикла, а как раз "условием выхода из него). for(int i=0;i<otv;i++)
4. использовать i в функции ellipse, делать с помощью нее какое-то смещение. что-бы кружки не накладывались.

leshak
Offline
Зарегистрирован: 29.09.2011

А еще... нужно научится темы называть как-то более информативно. Можно подумать, это первая тема за полгода которая содержит вопрос. А все остальные темы на форуме - дык сплошные ответы. сразу. без вопросов.

Jameson
Offline
Зарегистрирован: 21.03.2014

Ну а как мне тогда поставить ограничитель на количество кружков?

Jameson
Offline
Зарегистрирован: 21.03.2014

1. otv вам нужно сделать глобальным, и увеличивать его на нажатие мышки)- ВОТ ТУТ Я НЕ ПОНЯЛ ЭТО КАК? можешь пример привести ?

leshak
Offline
Зарегистрирован: 29.09.2011

Jameson пишет:

1. otv вам нужно сделать глобальным, и увеличивать его на нажатие мышки)- ВОТ ТУТ Я НЕ ПОНЯЛ ЭТО КАК? можешь пример привести ?

Нужно не пример. Он у вас перед глазами, в вашем же скетче. Там есть и глобальные перменные и локальные. Вам нужно открыть любой учебник по программирования. И разобратся с тем какие бывают переменные. Разделы "обласить видимости переменных", "объявление переменных" и т.п. Что-бы слова "глобальная"/"локальная" несли семантический смысл для вас. Что бы вы понимали в чем их отличие с точки зрения компилятора. Чем отличается их поведение. А не "объявлять наобум где и как прийдется".

И отложить временно в сторону кружочки, площади и т.п. Научится просто по нажатию кнопки, увеличивать какую-то переменную. Просто выводя ее через println

inspiritus
Offline
Зарегистрирован: 17.12.2012

Может быть проблема того , что " for не выполняет свою задачу тоесть не прибавляет значение +1 к переменной otv"  в пробеле между otv и ++ ?

читаем http://arduino.ru/Reference/Increment

не имею возможности проверить, но странно, как компиллятор это пропускает.

и еще, в названии топика желательно хоть как то отражать его содержание. Тут практически все топики - вопросы к сообществу.

Jameson
Offline
Зарегистрирован: 21.03.2014
if(button2[u]) 
   {            fill(0,255,0); 
         float sum;
         int otv;
         sum=distTotal/6;
         println(sum);
           for(otv=0;otv < sum-1;++otv)
           {
             println(otv);
         if(mousePressed==true)
         {
           ellipse(mouseX,mouseY,20,20);
         }
           }
   }

Вот чуть подправил теперь otv  считает, но считает сразу как только я нажал активировал функцию "Рисовать кружки" он сразу посчитал допустим (sum =60 ) otv =10; он считает сразу а не после каждого создания кружка

inspiritus
Offline
Зарегистрирован: 17.12.2012

А для чего Вы поставили плюсики перед переменной ?

leshak
Offline
Зарегистрирован: 29.09.2011

>Вот чуть подправил теперь otv  считает

Как я писал вам выше, он у вас и раньше считал. Только вы этого не видели. Так как небыло println внутри цикла.
Переделывать otv++, на ++otv - было не обязательно. В циклах, все-таки традиционней otv++ использовать. Тогда вносить "поправку на ветер" в виде sum-1 не пришлось-бы.

А вообще, IMHO, вы сейчас просто не понимание когда вызывается draw(), СКОЛЬКО РАЗ, что происходит между его вызовыми.

Вы сейчас пытаетесь угадать/подобрать ответ.

Еще раз советую. Забудте про кружочки. Сохраните свой скетч, сделайте File/New и напишите новый. Который делает такое:

1. На каждый клик мышки увеличивает какую-то переменную на единицу. Пусть она называется clickCnt;
2. Выводит эту переменную с помощью println

Все. Больше ничего.

Пока вы этого не сделаете, как бы вы не мучали свои циклы, как бы не ограничивали otv, как бы не вводили "поправки на ветер" решить задачу "нарисовать столько кружочков сколько раз кликнули мышкой" - вы не сможете.

Если не известно "сколько кружочков нужно", то как можно нарисовать их правильное количество? 

 

leshak
Offline
Зарегистрирован: 29.09.2011

inspiritus пишет:

А для чего Вы поставили плюсики перед переменной ?

Скорее всего "просто где-то увидел что бывают плюсики перед переменной". А в чем разница между плюсиками перед и после - пока не известно.