int main(void) { const int size = 7; //0: test two 0s int test1[] = {0,1,2,-1,-2,-3,0}; //0 test 1 0 with odd number of negatives int test2[] = {0,-1,2,1,2,3,4}; //48 test 1 0 with even number of negatives int test3[] = {0,-1,-2,1,2,3,4}; //96 test even number of negatives int test4[] = {2,-1,-2,1,2,3,4}; //96 test odd number of negatives int test5[] = {2,-1,-2,-1,2,3,4}; printf("0 == %d\n", max_p(test1,sizeof(test1)/sizeof(test1[0]))); printf("0 == %d\n", max_p(test2,sizeof(test2)/sizeof(test2[0]))); printf("48 == %d\n", max_p(test3,sizeof(test3)/sizeof(test3[0]))); printf("96 == %d\n", max_p(test4,sizeof(test4)/sizeof(test4[0]))); printf("96 == %d\n", max_p(test5,sizeof(test5)/sizeof(test5[0]))); return 0; }
double KdTree::computeCost (LineSegments &lineSegments, LineSegments::iterator begin, LineSegments::iterator end, Point* p, int splitType) { int TL = 0; int TR = 0; Parameter PL, PR; Parameter min_p((double)999999); Parameter max_p((double)-999999); if (splitType == 0) { for (LineSegments::iterator it = begin; it != end; ++it) { //pl(*it); if ((*it)->p0 != p && (*it)->p1 != p && XOrder((*it)->p0, p) == 1 && XOrder((*it)->p1, p) == 1) { TL++; if ((*it)->p0->getP().getX() < min_p) { min_p = (*it)->p0->getP().getX(); } if ((*it)->p1->getP().getX() < min_p) { min_p = (*it)->p1->getP().getX(); } } else if ((*it)->p0 != p && (*it)->p1 != p && XOrder(p, (*it)->p0) == 1 && XOrder(p, (*it)->p1) == 1) { TR++; if ((*it)->p0->getP().getX() > max_p) { max_p = (*it)->p0->getP().getX(); } if ((*it)->p1->getP().getX() > max_p) { max_p = (*it)->p1->getP().getX(); } } else { TL++; TR++; if ((*it)->p0->getP().getX() < min_p) { min_p = (*it)->p0->getP().getX(); } if ((*it)->p1->getP().getX() < min_p) { min_p = (*it)->p1->getP().getX(); } if ((*it)->p0->getP().getX() > max_p) { max_p = (*it)->p0->getP().getX(); } if ((*it)->p1->getP().getX() > max_p) { max_p = (*it)->p1->getP().getX(); } } } PL = (p->getP().getX() - min_p) / (max_p - min_p); PR = (max_p - p->getP().getX()) / (max_p - min_p); } else { for (LineSegments::iterator it = begin; it != end; ++it) { if ((*it)->p0 != p && (*it)->p1 != p && YOrder((*it)->p0, p) == 1 && YOrder((*it)->p1, p) == 1) { TL++; if ((*it)->p0->getP().getY() < min_p) { min_p = (*it)->p0->getP().getY(); } if ((*it)->p1->getP().getY() < min_p) { min_p = (*it)->p1->getP().getY(); } } else if ((*it)->p0 != p && (*it)->p1 != p && YOrder(p, (*it)->p0) == 1 && YOrder(p, (*it)->p1) == 1) { TR++; if ((*it)->p0->getP().getY() > max_p) { max_p = (*it)->p0->getP().getY(); } if ((*it)->p1->getP().getY() > max_p) { max_p = (*it)->p1->getP().getY(); } } else { TL++; TR++; if ((*it)->p0->getP().getY() < min_p) { min_p = (*it)->p0->getP().getY(); } if ((*it)->p1->getP().getY() < min_p) { min_p = (*it)->p1->getP().getY(); } if ((*it)->p0->getP().getY() > max_p) { max_p = (*it)->p0->getP().getY(); } if ((*it)->p1->getP().getY() > max_p) { max_p = (*it)->p1->getP().getY(); } } } PL = (p->getP().getY() - min_p) / (max_p - min_p); PR = (max_p - p->getP().getY()) / (max_p - min_p); } return log((double)TL) * PL.mid() + log((double)TR) * PR.mid(); }