void WireSet::threadedFunction() { while (ofThread::isThreadRunning()) { lock(); if (!finishedWires) { addWire(); if (radius > 14.0f) { calc(); finishedWires = true; } } else fillWire(0.04f, 0.02f); unlock(); } }
void Wire::connectWire(Wire *w, int wirePart) { //добавляем провод в список проводов this->wires->append(w); //устанавливаем такой же список и на присоединяемый провод delete w->getConnectedWires(); w->setWireList(wires); QPoint* last = w->getPath()->last(); QPoint* beforeLast = w->getPath()->at(w->getPath()->size()-2); //присоединяем в ближайшей точке QPoint *tmp1 = this->path->at(--wirePart); QPoint *tmp2 = this->path->at(++wirePart); //делим провод на 2 Wire* secondWire = new Wire(); int index=0; if(abs(tmp1->x()-last->x())+abs(tmp1->y()-last->y())<10) { if(last->x()==beforeLast->x()) { last->setX(tmp1->x()); last->setY(tmp1->y()); beforeLast->setX(tmp1->x()); index = wirePart-1; } else { last->setX(tmp1->x()); last->setY(tmp1->y()); beforeLast->setY(tmp1->y()); index = wirePart-1; } } else if (abs(tmp2->x()-last->x())+abs(tmp2->y()-last->y())<10){ index = wirePart; if(last->x()==beforeLast->x()) { last->setX(tmp2->x()); last->setY(tmp2->y()); beforeLast->setX(tmp2->x()); } else { last->setX(tmp2->x()); last->setY(tmp2->y()); beforeLast->setY(tmp2->y()); } } else { //если нету ближайшей точки, то присоединяем так if(tmp1->x()==tmp2->x()) { last->setX(tmp1->x()); } else if(tmp1->y()==tmp2->y()) { last->setY(tmp1->y()); } else { //emmit error } index = wirePart; secondWire->addPoint(new QPoint(last->x(),last->y())); } if(this->wireConnector!=NULL) { secondWire->setWireConnector(this->wireConnector); } //надо добавить в список отрисовываемых объектов this->wireConnector = new WireConnector(last->x(),last->y()); for(int i=index;i!=this->path->size();i++) { QPoint *point = path->at(i); secondWire->addPoint(point); } if(connected2!=NULL) { secondWire->endConnection(this->connected2); //вот это поворот this->connected2=NULL; } int count = this->path->size()-index; for(int i=0;i<(count);i++) { this->path->removeLast(); } this->path->append(new QPoint(last->x(),last->y())); this->wires->append(secondWire); secondWire->setWireList(wires); emit addWire(secondWire); }
int main() { int n,r,c,temp,x1,x2,y1,y2,i,j,vs1,vs2,val[123]={0}, num[52][52]; Group **board; Set *set1, *set2; char type; char input[20]; for(i=65; i<=90; i++) val[i] = i-65; for(i=97; i<=122; i++) val[i] = (i-97)+26; for(i=0; i<52; i++) { for(j=0; j<52; j++) { num[i][j] = 52*i + j; } } scanf("%d %d %d",&n,&r,&c); getchar(); board = (Group**) malloc(r*sizeof(Group*)); for(i=0; i<r; i++) { board[i] = (Group*) malloc(c*sizeof(Group)); for(j=0; j<c; j++) { board[i][j].next = NULL; board[i][j].set = NULL; board[i][j].vs = 0; } } while(n--) { gets(input); type=input[0]; switch(type) { case 'W': x1 = num[val[input[1]]][val[input[2]]]; y1 = num[val[input[3]]][val[input[4]]]; x2 = num[val[input[5]]][val[input[6]]]; y2 = num[val[input[7]]][val[input[8]]]; addWire(&board[(y1-1)/5][x1-1],&board[(y2-1)/5][x2-1]); break; case 'V': x1 = num[val[input[1]]][val[input[2]]]; y1 = num[val[input[3]]][val[input[4]]]; addVoltage(&board[(y1-1)/5][x1-1]); break; case 'R': x1 = num[val[input[1]]][val[input[2]]]; y1 = num[val[input[3]]][val[input[4]]]; remVoltage(&board[(y1-1)/5][x1-1]); break; case 'L': x1 = num[val[input[1]]][val[input[2]]]; y1 = num[val[input[3]]][val[input[4]]]; x2 = num[val[input[5]]][val[input[6]]]; y2 = num[val[input[7]]][val[input[8]]]; vs1 = board[(y1-1)/5][x1-1].vs; vs2 = board[(y2-1)/5][x2-1].vs; set1 = board[(y1-1)/5][x1-1].set; set2 = board[(y2-1)/5][x2-1].set; vs1 = (set1!=NULL)?(set1->vs):(vs1); vs2 = (set2!=NULL)?(set2->vs):(vs2); if( (vs1==0&&vs2==0) || (vs1>0&&vs2>0) ) printf("OFF\n"); else printf("ON\n"); break; } } for(i=0; i<r; i++) { free(board[i]); } free(board); return 0; }