示例#1
0
void unary_interval_updater::expand(theorem_node *n, property const &p)
{
  int b = 3;
  property res = p;
  interval const &bnd = p.bnd();
  interval &ih = n->hyp[0].bnd(), &ir = res.bnd();
  interval hyp = ih;
  while (b != 0) {
    if (b & 1) {
      number const &old = lower(ih);
      number m = simplify(old, -1);
      if (m != old) {
        hyp = interval(m, upper(ih));
        (*compute)(hyp, ir);
        if (!(ir <= bnd)) { hyp = ih; b &= ~1; }
        else ih = hyp;
      } else b &= ~1;
    }
    if (b & 2) {
      number const &old = upper(ih);
      number m = simplify(old, 1);
      if (m != old) {
        hyp = interval(lower(ih), m);
        (*compute)(hyp, ir);
        if (!(ir <= bnd)) { hyp = ih; b &= ~2; }
        else ih = hyp;
      } else b &= ~2;
    }
  }
  (*compute)(hyp, ir);
  n->res = boundify(p, res);
}
示例#2
0
void binary_interval_updater::expand(theorem_node *n, property const &p)
{
  int b = 15;
  property res = p;
  interval const &bnd = p.bnd();
  interval &i1 = n->hyp[0].bnd(), &i2 = n->hyp[1].bnd(), &ir = res.bnd();
  interval hyps[] = { i1, i2 };
  while (b != 0) {
    if (b & 1) {
      number const &old = lower(i1);
      number m = simplify(old, -1);
      if (m != old) {
        hyps[0] = interval(m, upper(i1));
        (*compute)(hyps, ir);
        if (!(ir <= bnd)) { hyps[0] = i1; b &= ~1; }
        else i1 = hyps[0];
      } else b &= ~1;
    }
    if (b & 2) {
      number const &old = upper(i1);
      number m = simplify(old, 1);
      if (m != old) {
        hyps[0] = interval(lower(i1), m);
        (*compute)(hyps, ir);
        if (!(ir <= bnd)) { hyps[0] = i1; b &= ~2; }
        else i1 = hyps[0];
      } else b &= ~2;
    }
    if (b & 4) {
      number const &old = lower(i2);
      number m = simplify(old, -1);
      if (m != old) {
        hyps[1] = interval(m, upper(i2));
        (*compute)(hyps, ir);
        if (!(ir <= bnd)) { hyps[1] = i2; b &= ~4; }
        else i2 = hyps[1];
      } else b &= ~4;
    }
    if (b & 8) {
      number const &old = upper(i2);
      number m = simplify(old, 1);
      if (m != old) {
        hyps[1] = interval(lower(i2), m);
        (*compute)(hyps, ir);
        if (!(ir <= bnd)) { hyps[1] = i2; b &= ~8; }
        else i2 = hyps[1];
      } else b &= ~8;
    }
  }
  (*compute)(hyps, ir);
  n->res = boundify(p, res);
}
示例#3
0
 virtual void enlarge(property const &p) { res = boundify(p, res); }
示例#4
0
void ConnectorLine::drawShape(QPainter &p) {
	if (!m_bAnimateCurrent) {
		QCanvasLine::drawShape(p);
		return;
	}

	const int ss = 3; // segment spacing
	const int sl = 13; // segment length (includes segment spacing)

	int offset = int(dynamic_cast<ElectronicConnector *>(m_pConnector)->currentAnimationOffset() - m_pixelOffset);
	offset = ((offset % sl) - sl) % sl;

	int x1 = startPoint().x();
	int y1 = startPoint().y();
	int x2 = endPoint().x();
	int y2 = endPoint().y();

	QPen pen = p.pen();
// 	pen.setStyle( Qt::DashDotLine );
	p.setPen(pen);

	if (x1 == x2) {
		int _x = int(x() + x1);
		int y_end = int(y() + y2);

		if (y1 > y2) {
			// up connector line
			for (int _y = int(y() + y1 - offset); _y >= y_end; _y -= sl) {
				int y_1 = boundify(_y, int(y() + y1), y_end);
				int y_2 = boundify(_y - (sl - ss), int(y() + y1), y_end);
				p.drawLine(_x, y_1, _x, y_2);
			}
		} else {
			// down connector line
			for (int _y = int(y() + y1 + offset); _y <= y_end; _y += sl) {
				int y_1 = boundify(_y, int(y() + y1), y_end);
				int y_2 = boundify(_y + (sl - ss), int(y() + y1), y_end);
				p.drawLine(_x, y_1, _x, y_2);
			}
		}
	} else {
		// y1 == y2
		int _y    = int(y() + y1);
		int x_end = int(x() + x2);

		if (x1 > x2) {
			// left connector line
			int x_start = int(x() + x1 - offset);

			for (int _x = x_start; _x >= x_end; _x -= sl) {
				int x_1 = boundify(_x, int(x() + x1), x_end);
				int x_2 = boundify(_x - (sl - ss), int(x() + x1), x_end);
				p.drawLine(x_1, _y, x_2, _y);
			}
		} else {
			// right connector line
			for (int _x = int(x() + x1 + offset); _x <= x_end; _x += sl) {
				int x_1 = boundify(_x, int(x() + x1), x_end);
				int x_2 = boundify(_x + (sl - ss), int(x() + x1), x_end);
				p.drawLine(x_1, _y, x_2, _y);
			}
		}
	}
}