// scan-line conversion void _scanTriangle(const mbgl::vec2<double> a, const mbgl::vec2<double> b, const mbgl::vec2<double> c, int32_t ymin, int32_t ymax, ScanLine& scanLine) { edge ab = _edge(a, b); edge bc = _edge(b, c); edge ca = _edge(c, a); // sort edges by y-length if (ab.dy > bc.dy) { std::swap(ab, bc); } if (ab.dy > ca.dy) { std::swap(ab, ca); } if (bc.dy > ca.dy) { std::swap(bc, ca); } // scan span! scan span! if (ab.dy) _scanSpans(ca, ab, ymin, ymax, scanLine); if (bc.dy) _scanSpans(ca, bc, ymin, ymax, scanLine); }
void Prime::render(uint8_t& r, uint8_t& g, uint8_t& b) { switch (pattern) { case PRIME_STROBE: _strobe(this, 10, 16); break; case PRIME_HYPER: _strobe(this, 34, 34); break; case PRIME_DOPS: _strobe(this, 3, 20); break; case PRIME_STROBIE: _strobe(this, 6, 46); break; case PRIME_PULSE: _pulse(this, 200, 50); break; case PRIME_SEIZURE: _strobe(this, 10, 190); break; case PRIME_TRACER: _tracer(this, 6, 46); break; case PRIME_DASHDOPS: _dashdops(this, 22, 3, 20, 7); break; case PRIME_BLINKE: _blinke(this, 10, 100); break; case PRIME_EDGE: _edge(this, 4, 16, 40); break; case PRIME_LEGO: _lego(this, 16); break; case PRIME_CHASE: _chase(this, 100, 20, 5); break; case PRIME_MORPH: _morph(this, 34, 34, 4); break; case PRIME_RIBBON: _strobe(this, 22, 0); break; case PRIME_COMET: _comet(this, 30, 16, 2); break; case PRIME_CANDY: _candy(this, 10, 16, 3, 8); break; default: break; } tick++; r = _r; g = _g; b = _b; }
void ReTriangulation::legalizeEdge(std::vector<Vec3f>* point, std::vector<Vec2i>& illegalEdge, std::vector<Vec3i>& triangles) { GeometricFunc func; int i=0; while(1) { if(illegalEdge.empty()) break; std::vector<int> triIdx; std::vector<int> pointIdx; if(illegalEdge.size()<=i) i=0; Vec2i edge=illegalEdge[i]; // illegal한 edge를 포함하는 triangle들을 찾는다 for(int j=0;j<triangles.size();j++) { if(func.isTriangleContainEdge(illegalEdge[i], triangles[j])) { triIdx.push_back(j); for(int k=0;k<3;k++) { if((triangles[j][k]!=edge[0])&&(triangles[j][k]!=edge[1])) { pointIdx.push_back(triangles[j][k]); break; } } } } if(triIdx.size()==2) { // 새로 생기는 edge가 illegal edge인지 검사한다. Vec2i _edge(pointIdx[0], pointIdx[1]); bool flag=true; for(int j=0;j<illegalEdge.size();j++) { if(func.isEdgeSame(illegalEdge[j], _edge)) { flag=false; break; } } if(flag) { triangles[triIdx[0]]=Vec3i(pointIdx[0], pointIdx[1], edge[0]); triangles[triIdx[1]]=Vec3i(pointIdx[0], pointIdx[1], edge[1]); illegalEdge[i]=illegalEdge[illegalEdge.size()-1]; illegalEdge.pop_back(); i--; } } else { illegalEdge[i]=illegalEdge[illegalEdge.size()-1]; illegalEdge.pop_back(); i--; } i++; } }