void Pathfinder::getNeighbors(const Vector2i &position, const GameObject *forObj) { int posX = position.x; int posY = position.y; bool left = checkNeighbor(posX - 1, posY, forObj); bool top = checkNeighbor(posX, posY - 1, forObj); bool right = checkNeighbor(posX + 1, posY, forObj); bool bottom = checkNeighbor(posX, posY + 1, forObj); if (left && top) { checkNeighbor(posX - 1, posY - 1, forObj); } if (top && right) { checkNeighbor(posX + 1, posY - 1, forObj); } if (bottom && left) { checkNeighbor(posX - 1, posY + 1, forObj); } if (bottom && right) { checkNeighbor(posX + 1, posY + 1, forObj); } }
boolean topo_recv(comBuf *pkt, uint8_t **footer, uint8_t port) { topo_pkt* topo = (topo_pkt*)pkt->data; switch (topo->type) { case TOPO_PING: { if (topo->seqNo == seqNo) { checkNeighbor(topo->route); } else { reinit(); seqNo = topo->seqNo; checkNeighbor(topo->route); topo->route = mos_node_id_get(); net_send(pkt, 77, 0); } } break; case TOPO_REPLY: { checkNeighbor(topo->route); printf("%d: ", topo->origin); uint8_t i; for (i = 0; i<(pkt->size-6)/2; i++) { printf(" %d", topo->neighbors[i]); } printf("\n"); if (topo->origin == mos_node_id_get()) break; for (i = 0; i<10; i++) { if (topo->origin == reply_cache[i]) break; } if (i == 10) { reply_cache[reply_ndx++] = topo->origin; reply_ndx %= 10; topo->route = mos_node_id_get(); net_send(pkt, 77, 0); } } break; } return 0; }
void element::refine() { int longEdge, test; longEdge = findLongestEdge(); if (requestResponse) { // this element sent a special request and has received a response // from its neighbor; the neighbor performed half the refinement splitHelp(longEdge); // now finish the other half return; } if (specialRequest) { // my neighbor sent me a special request to refine if (getArea() < targetArea) { // no refinement necessary; accept request splitResponse(longEdge); // do my half of the refine return; } else { // refinement necessary if ((myRef.idx > specialRequester.idx) || ((myRef.idx == specialRequester.idx) && (myRef.cid > specialRequester.cid))) { // I have precedence; accept request splitResponse(longEdge); return; } else // requester has precedence; will send it special request shortly specialRequest = pendingRequest = 0; } } if (pendingRequest) // still awaiting a response; skip me return; // test longEdge relationship test = checkNeighbor(longEdge); if (test == -1) // long edge is on border splitBorder(longEdge); else if (test == 1) { // long edge is longest of both elements if (!edges[longEdge].locked(C)) splitNeighbors(longEdge); } else // long edge is not neighbor's long edge refineNeighbor(longEdge); }