int main (void) { A2 = fA(); B2 = fB(); C2 = fC(); D2 = fD(); return all (0); }
void g() { mixed_up<A, B, C> m; fA(m); fB(m); fC(m); }
TreeNode * tree_search(TreeNode *l,PData matchKey,CompareFunction fC){ if (!l) return NULL; printf(", (%d ,%d),\n",(int)l->data,(int)matchKey); if (fC(matchKey,l->data) == 0) return l; TreeNode *x= l->first_child; while(x){ TreeNode *y = tree_search(x,matchKey,fC); if (y) return y; else x=x->next; } return NULL; }
float forceThin(float** arr, const int N, const int M, const int x, const int y, const std::vector<ivec2> borders) { vec2 a(x-0.5,y+0.5); vec2 b(x+0.5,y+0.5); vec2 c(x+0.5,y-0.5); vec2 d(x-0.5,y-0.5); vec2 fA(0.0,0.0); vec2 fB(0.0,0.0); vec2 fC(0.0,0.0); vec2 fD(0.0,0.0); for (unsigned int i=0; i < borders.size(); ++i) { if (distance(ivec2(x,y), borders[i]) <= 16) { std::vector<ivec2> line; line = draw_line(ivec2(x,y), borders[i]); bool outofsight = false; //printf("(%d,%d)\n(%d,%d) %zd\n", x, y, borders[i].x, borders[i].y, line.size()); for (unsigned int j=0; j < line.size(); ++j) { //printf("\t%d\n", j); outofsight |= arr[line[j].x][line[j].y] == 0.5; } if (!outofsight) { float dist = distance(a, borders[i]); float dx = a.x - borders[i].x; float dy = a.y - borders[i].y; fA = fA + vec2(dx/(abs(dx)+abs(dy)) / dist, dy/(abs(dx)+abs(dy)) / dist); dist = distance(b, borders[i]); dx = b.x - borders[i].x; dy = b.y - borders[i].y; fB = fB + vec2(dx/(abs(dx)+abs(dy)) / dist, dy/(abs(dx)+abs(dy)) / dist); dist = distance(c, borders[i]); dx = c.x - borders[i].x; dy = c.y - borders[i].y; fC = fC + vec2(dx/(abs(dx)+abs(dy)) / dist, dy/(abs(dx)+abs(dy)) / dist); dist = distance(d, borders[i]); dx = d.x - borders[i].x; dy = d.y - borders[i].y; fD = fD + vec2(dx/(abs(dx)+abs(dy)) / dist, dy/(abs(dx)+abs(dy)) / dist); } } } //S |= fA.x*fB.x <= 0.0 && abs(fA.y)+abs(fB.y) > abs(fA.x)+abs(fB.x); //S |= fC.x*fD.x <= 0.0 && abs(fC.y)+abs(fD.y) > abs(fC.x)+abs(fD.x); //S |= fA.y*fD.y <= 0.0 && abs(fA.y)+abs(fD.y) > abs(fA.x)+abs(fD.x); //S |= fB.y*fC.y <= 0.0 && abs(fB.y)+abs(fC.y) > abs(fB.x)+abs(fC.x); //S |= fA.x*fC.x <= 0.0 && fA.y * fC.y <= 0.0; //S |= fB.x*fD.x <= 0.0 && fB.y * fD.y <= 0.0; //S |= fA.x*fB.x <= 0.0 && fC.x*fD.x <= 0.0 && (abs(fA.x)+abs(fB.x) > abs(fA.y)+abs(fB.y) || abs(fC.x)+abs(fD.x) > abs(fC.y)+abs(fD.y)); //S |= fA.y*fD.y <= 0.0 && fB.y*fC.y <= 0.0 && (abs(fA.y)+abs(fD.y) > abs(fA.x)+abs(fD.x) || abs(fB.y)+abs(fC.y) > abs(fB.x)+abs(fC.x)); //S |= fA.x*fC.x <= 0.0 && fA.y*fC.y <= 0.0; //S |= fB.x*fD.x <= 0.0 && fB.y*fD.y <= 0.0; //dot products to find change in direction float dot; float min_dot = INFINITY; dot = fA.x*fB.x + fA.y*fB.y; if (dot < min_dot) min_dot = dot; dot = fB.x*fC.x + fB.y*fC.y; if (dot < min_dot) min_dot = dot; dot = fA.x*fD.x + fA.y*fD.y; if (dot < min_dot) min_dot = dot; dot = fC.x*fD.x + fC.y*fD.y; if (dot < min_dot) min_dot = dot; dot = fA.x*fC.x + fA.y*fC.y; if (dot < min_dot) min_dot = dot; dot = fB.x*fD.x + fB.y*fD.y; if (dot < min_dot) min_dot = dot; return min_dot; }