示例#1
0
TEST(QiOs, timeValCtor)
{
  qi::os::timeval t0 = qi::os::timeval();
  // t0 members are initialized to 0
  EXPECT_EQ(0, t0.tv_sec);
  EXPECT_EQ(0, t0.tv_usec);
  qi::os::timeval t1;
  // t1 members are initialized to 0
  EXPECT_EQ(0, t1.tv_sec);
  EXPECT_EQ(0, t1.tv_usec);

  // t2 members are not normalized
  qi::os::timeval t2(-1, -2);
  EXPECT_EQ(-1, t2.tv_sec);
  EXPECT_EQ(-2, t2.tv_usec);

  qi::Seconds s(123456789);
  qi::MicroSeconds us(123456);
  qi::NanoSeconds ns(789);
  qi::Duration d_us(s + us);
  qi::Duration d_ns(d_us + ns);
  qi::int64_t normalized_s = s.count();
  qi::int64_t normalized_us = us.count();

  // positive
  {
    qi::os::timeval tv0(d_us);
    EXPECT_EQ(normalized_s, tv0.tv_sec);
    EXPECT_EQ(normalized_us, tv0.tv_usec);

    qi::Duration d_back = qi::Seconds(tv0.tv_sec) +
                          qi::MicroSeconds(tv0.tv_usec);
    EXPECT_TRUE(d_us - d_back < qi::MicroSeconds(1));
    qi::os::timeval tv1(d_us);
    EXPECT_EQ(normalized_s, tv1.tv_sec);
    EXPECT_EQ(normalized_us, tv1.tv_usec);
  }
  // negative
  d_us = -d_us;
  d_ns = -d_ns;
  normalized_s = -s.count() - 1;
  normalized_us = -us.count() + 1000000;
  {
    qi::os::timeval tv0(d_us);
    EXPECT_EQ(normalized_s, tv0.tv_sec);
    EXPECT_EQ(normalized_us, tv0.tv_usec);

    qi::Duration d_back = qi::Seconds(tv0.tv_sec) +
                          qi::MicroSeconds(tv0.tv_usec);
    EXPECT_TRUE(d_us - d_back < qi::MicroSeconds(1));
    qi::os::timeval tv1(d_us);
    EXPECT_EQ(normalized_s, tv1.tv_sec);
    EXPECT_EQ(normalized_us, tv1.tv_usec);
  }
}
示例#2
0
		void Circle::appendBoundary(const IModel* p) {
			Circle c2;
			p->im_getBVolume(c2);
			Vec2 toC2 = c2.vCenter - vCenter;
			float lensq = toC2.len_sq();
			if(lensq >= ZEROVEC_LENGTH_SQ) {
				toC2 *= spn::RSqrt(lensq);
				Vec2 tv(support(toC2) - c2.support(-toC2));
				float r_min = std::min(fRadius, c2.fRadius);
				if(tv.dot(toC2) < 0 ||
					tv.len_sq() < spn::Square(r_min*2))
				{
					// 新たな円を算出
					Vec2 tv0(vCenter - toC2*fRadius),
						 tv1(c2.vCenter + toC2*c2.fRadius);
					fRadius = tv0.distance(tv1) * .5f;
					vCenter = (tv0+tv1) * .5f;
				} else {
					// 円が内包されている
					if(fRadius < c2.fRadius) {
						fRadius = c2.fRadius;
						vCenter = c2.vCenter;
					}
				}
			} else {
				// 円の中心が同じ位置にある
				fRadius = std::max(c2.fRadius, fRadius);
			}
		}