Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
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();
}