bool EnvEntrance::Near(const QVector3D & p, const float dist) const { QVector3D midpt(bx1+bx2+1, p.y(), by1+by2+1); midpt *= 0.5f; return (p-midpt).lengthSquared() < dist*dist; }
int main() { pt pt1 = {}, pt2 = {}, *p_pt = NULL; printf("请输入一个点的位置:"); scanf("%d%d", &(pt1.y), &(pt1.x)); printf("请输入一个点的位置:"); scanf("%d%d", &(pt2.y), &(pt2.x)); midpt(&pt1, &pt2, p_pt); if (p_pt) { printf("中点位置是(%d, %d)\n", p_pt->y, p_pt->x); free(p_pt); p_pt = NULL; } return 0; }
std::vector<double> crk4(class Container1<functor_type>::iterator funct_iter1, class Container1<functor_type>::iterator funct_iter2, class Container2<coord_type>::iterator coord_iter1, class Container2<coord_type>::iterator coord_iter2, t_type t, double h) { auto k1 = init(funct_iter1, funct_iter2, coord_iter1, coord_iter2, t); auto m1 = midpt(k1, coord_iter1, h); t += 0.5*h; auto k2 = init(funct_iter1, funct_iter2, coord_iter1, coord_iter2, t); auto m2 = midpt(k1, coord_iter1, h); auto k3 = init(funct_iter1, funct_iter2, coord_iter1, coord_iter2, t); auto m3 = midpt(k1, coord_iter1, h); t += 0.5*h; auto k4 = init(funct_iter1, funct_iter2, coord_iter1, coord_iter2, t); auto coord_next = runge_kutta4(coord_iter1, coord_iter2, k1.begin(), k2.begin(), k3.begin(), k4.begin(), h); return coord_next; }
bool generateLinearSeparation(std::vector<point>& inputPoints, double& a, double& b, double& c, int& nBad1, int& nBad2, point& centroidOne, point& centroidTwo) { int numOne=0, numTwo=0; for (std::vector<point>::iterator pt = inputPoints.begin(); pt != inputPoints.end(); pt++) { if (pt->isClassOne) { numOne++; centroidOne.x += pt->x; centroidOne.y += pt->y; } else { numTwo++; centroidTwo.x += pt->x; centroidTwo.y += pt->y; } } centroidOne.x /= numOne; centroidOne.y /= numOne; centroidTwo.x /= numTwo; centroidTwo.y /= numTwo; outputPoint(centroidOne); outputPoint(centroidTwo); point midpt( (centroidTwo.x+centroidOne.x)/2, (centroidTwo.y+centroidOne.y)/2); outputPoint(midpt); //direction vector point oneToTwo( centroidTwo.x-centroidOne.x, centroidTwo.y-centroidOne.y); double mag = distance(oneToTwo,point(0,0,false)); std::cerr << mag << std::endl; oneToTwo.x /= mag; oneToTwo.y /= mag; //actual direction point bisector(oneToTwo.x,oneToTwo.y); outputPoint(bisector); b = bisector.y; a = bisector.x; c = -(a*midpt.x+b*midpt.y); for (std::vector<point>::iterator pt = inputPoints.begin(); pt != inputPoints.end(); pt++) { if(pt->isClassOne) { if(SGN(a*pt->x+b*pt->y+c) != SGN(a*centroidOne.x+b*centroidOne.y+c)) nBad1++; } else { if(SGN(a*pt->x+b*pt->y+c) != SGN(a*centroidTwo.x+b*centroidTwo.y+c)) nBad2++; } } return true; }