ArtContourFx()
     : m_colorIndex(L"1,2,3")
     , m_keepColor(false)
     , m_keepLine(false)
     , m_includeAlpha(true)
     , m_density(0.0)
     , m_distance(DoublePair(30.0, 30.0))
     , m_randomness(true)
     , m_orientation(DoublePair(0.0, 180.0))
     , m_size(DoublePair(30.0, 30.0)) {
   bindParam(this, "Color_Index", m_colorIndex);
   bindParam(this, "Keep_color", m_keepColor);
   bindParam(this, "Keep_Line", m_keepLine);
   bindParam(this, "Include_Alpha", m_includeAlpha);
   bindParam(this, "Density", m_density);
   bindParam(this, "Distance", m_distance);
   bindParam(this, "Randomness", m_randomness);
   bindParam(this, "Orientation", m_orientation);
   bindParam(this, "Size", m_size);
   addInputPort("Source", m_input);
   addInputPort("Controller", m_controller);
   m_density->setValueRange(0.0, 100.0);
   m_distance->getMin()->setValueRange(0.0, 1000.0);
   m_distance->getMax()->setValueRange(0.0, 1000.0);
   m_orientation->getMin()->setValueRange(-180.0, 180.0);
   m_orientation->getMax()->setValueRange(-180.0, 180.0);
   m_orientation->getMin()->setMeasureName("angle");
   m_orientation->getMax()->setMeasureName("angle");
   m_size->getMin()->setValueRange(0.0, 1000.0);
   m_size->getMax()->setValueRange(0.0, 1000.0);
 }
void NegativeBinomialRand<double>::Fit(const std::vector<int> &sample)
{
    /// Check positivity of sample
    if (!allElementsAreNonNegative(sample))
        throw std::invalid_argument(fitErrorDescription(WRONG_SAMPLE, NON_NEGATIVITY_VIOLATION));
    /// Initial guess by method of moments
    DoublePair stats = GetSampleMeanAndVariance(sample);
    double mean = stats.first, variance = stats.second;
    /// Method can't be applied in the case of too small variance
    if (variance <= mean)
        throw std::invalid_argument(fitErrorDescription(NOT_APPLICABLE, TOO_SMALL_VARIANCE));
    double guess = mean * mean / (variance - mean);
    size_t n = sample.size();
    if (!RandMath::findRoot([sample, mean, n] (double x)
    {
        double first = 0.0, second = 0.0;
        for (const double & var : sample) {
            first += RandMath::digamma(var + x);
            second += RandMath::trigamma(var + x);
        }
        first -= n * (RandMath::digammamLog(x) + std::log(x + mean));
        second -= n * (RandMath::trigamma(x) - mean / (x * (mean + x)));
        return DoublePair(first, second);
    }, guess))
        throw std::runtime_error(fitErrorDescription(UNDEFINED_ERROR, "Error in root-finding algorithm"));
    if (guess <= 0.0)
        throw std::runtime_error(fitErrorDescription(WRONG_RETURN, "Number should be positive, but returned value is " + toStringWithPrecision(guess)));
    SetParameters(guess, guess / (guess + mean));
}
示例#3
0
	RGBMCutFx()
		: m_r_range(DoublePair(0., 255.)), m_g_range(DoublePair(0., 255.)), m_b_range(DoublePair(0., 255.)), m_m_range(DoublePair(0., 255.))
	{
		bindParam(this, "r_range", m_r_range);
		bindParam(this, "g_range", m_g_range);
		bindParam(this, "b_range", m_b_range);
		bindParam(this, "m_range", m_m_range);
		m_r_range->getMin()->setValueRange(0., 255.);
		m_g_range->getMin()->setValueRange(0., 255.);
		m_b_range->getMin()->setValueRange(0., 255.);
		m_m_range->getMin()->setValueRange(0., 255.);
		m_r_range->getMax()->setValueRange(0., 255.);
		m_g_range->getMax()->setValueRange(0., 255.);
		m_b_range->getMax()->setValueRange(0., 255.);
		m_m_range->getMax()->setValueRange(0., 255.);

		addInputPort("Source", m_input);
	}
示例#4
0
PrayerTimes::DoublePair PrayerTimes::sun_position(double jd)
{
    double d = jd - 2451545.0;
    double g = TrigHelper::fix_angle(357.529 + 0.98560028 * d);
    double q = TrigHelper::fix_angle(280.459 + 0.98564736 * d);
    double l = TrigHelper::fix_angle(q + 1.915 * TrigHelper::dsin(g) + 0.020 * TrigHelper::dsin(2 * g));

    // double r = 1.00014 - 0.01671 * dcos(g) - 0.00014 * dcos(2 * g);
    double e = 23.439 - 0.00000036 * d;

    double dd = TrigHelper::darcsin(TrigHelper::dsin(e) * TrigHelper::dsin(l));
    double ra = TrigHelper::darctan2(TrigHelper::dcos(e) * TrigHelper::dsin(l), TrigHelper::dcos(l)) / 15.0;
    ra = TrigHelper::fix_hour(ra);
    double eq_t = q / 15.0 - ra;

    return DoublePair(dd, eq_t);
}
示例#5
0
Iwa_TiledParticlesFx::Iwa_TiledParticlesFx()
	: m_source("Texture"), m_control("Control"), source_ctrl_val(0), bright_thres_val(25), center_val(TPointD(0.0, 0.0)), length_val(5.0), height_val(4.0), maxnum_val(10.0), lifetime_val(DoublePair(100., 100.)), lifetime_ctrl_val(0), column_lifetime_val(false), startpos_val(1), randseed_val(1), gravity_val(0.0), g_angle_val(0.0), gravity_ctrl_val(0), friction_val(0.0), friction_ctrl_val(0), windint_val(0.0), windangle_val(0.0), swingmode_val(new TIntEnumParam(SWING_RANDOM, "Random")), randomx_val(DoublePair(0., 0.)), randomy_val(DoublePair(0., 0.)), randomx_ctrl_val(0), randomy_ctrl_val(0), swing_val(DoublePair(0., 0.)), speed_val(DoublePair(0., 10.)), speed_ctrl_val(0), speeda_val(DoublePair(0., 0.)), speeda_ctrl_val(0), speeda_use_gradient_val(false), speedscale_val(false), toplayer_val(new TIntEnumParam(TOP_YOUNGER, "Younger")), mass_val(DoublePair(1., 1.)), scale_val(DoublePair(100., 100.)), scale_ctrl_val(0), scale_ctrl_all_val(false), rot_val(DoublePair(0., 0.)), rot_ctrl_val(0), trail_val(DoublePair(0., 0.)), trailstep_val(0.0), rotswingmode_val(new TIntEnumParam(SWING_RANDOM, "Random")), rotspeed_val(0.0), rotsca_val(DoublePair(0., 0.)), rotswing_val(DoublePair(0., 0.)), pathaim_val(false), opacity_val(DoublePair(0., 100.)), opacity_ctrl_val(0), trailopacity_val(DoublePair(0., 100.)), scalestep_val(DoublePair(0., 0.)), scalestep_ctrl_val(0), fadein_val(0.0), fadeout_val(0.0), animation_val(new TIntEnumParam(ANIM_HOLD, "Hold Frame")), step_val(1), gencol_ctrl_val(0), gencol_spread_val(0.0), genfadecol_val(0.0), fincol_ctrl_val(0), fincol_spread_val(0.0), finrangecol_val(0.0), finfadecol_val(0.0), foutcol_ctrl_val(0), foutcol_spread_val(0.0), foutrangecol_val(0.0), foutfadecol_val(0.0)

	  ,
	  source_gradation_val(false), pick_color_for_every_frame_val(false)
	  /*- 計算モード (背景+粒子/粒子/背景/照明された粒子 -*/
	  ,
	  iw_rendermode_val(new TIntEnumParam(REND_ALL, "All"))
	  /*- 粒子に貼られる絵の素材 -*/
	  ,
	  base_ctrl_val(0)
	  /*- カールノイズ的な動きを与える -*/
	  ,
	  curl_val(0.0)
	  /*- 手前奥でコントロールを立体化してみる -*/
	  ,
	  curl_ctrl_1_val(0), curl_ctrl_2_val(0)
	  /*- 粒子敷き詰め作戦。粒子を正三角形で敷き詰めたときの、 
		正三角形の一辺の長さをインチで指定する -*/
	  ,
	  iw_triangleSize(15.0)
	  /*- ひらひら回転 -*/
	  ,
	  flap_ctrl_val(0), iw_flap_velocity_val(0.0) /*- 回転角速度 -*/
	  ,
	  iw_flap_dir_sensitivity_val(1.0) /*- 回転軸感度 -*/
	  /*- ひらひら粒子に照明を当てる -*/
	  ,
	  iw_light_theta_val(60.0) /*- 光源の方向(Degree)-*/
	  ,
	  iw_light_phi_val(45.0) /*- 光源の傾き(Degree)-*/
	  /*- 読み込みマージン -*/
	  ,
	  margin_val(0.0)
	  /*- 重力を徐々に与えるためのフレーム長 -*/
	  ,
	  iw_gravityBufferFrame_val(0)
{
	addInputPort("Texture1", new TRasterFxPort, 0);
	addInputPort("Control1", new TRasterFxPort, 1);

	length_val->setMeasureName("fxLength");
	height_val->setMeasureName("fxLength");
	center_val->getX()->setMeasureName("fxLength");
	center_val->getY()->setMeasureName("fxLength");

	bindParam(this, "source_ctrl", source_ctrl_val);
	bindParam(this, "bright_thres", bright_thres_val);
	bright_thres_val->setValueRange(0, 255);
	bindParam(this, "center", center_val);
	bindParam(this, "length", length_val);
	length_val->setValueRange(1.0, (std::numeric_limits<double>::max)());
	bindParam(this, "height", height_val);
	height_val->setValueRange(1.0, (std::numeric_limits<double>::max)());
	bindParam(this, "birth_rate", maxnum_val);
	maxnum_val->setValueRange(0.0, (std::numeric_limits<double>::max)());
	bindParam(this, "lifetime", lifetime_val);
	lifetime_val->getMin()->setValueRange(0., +3000.);
	lifetime_val->getMax()->setValueRange(0., +3000.);
	bindParam(this, "lifetime_ctrl", lifetime_ctrl_val);
	bindParam(this, "column_lifetime", column_lifetime_val);
	bindParam(this, "starting_frame", startpos_val);
	bindParam(this, "random_seed", randseed_val);
	bindParam(this, "gravity", gravity_val);
	gravity_val->setValueRange(0.0, (std::numeric_limits<double>::max)());
	bindParam(this, "gravity_angle", g_angle_val);
	g_angle_val->setMeasureName("angle");
	bindParam(this, "gravity_ctrl", gravity_ctrl_val);
	bindParam(this, "friction", friction_val);
	bindParam(this, "friction_ctrl", friction_ctrl_val);
	bindParam(this, "wind", windint_val);
	bindParam(this, "wind_angle", windangle_val);
	windangle_val->setMeasureName("angle");
	bindParam(this, "swing_mode", swingmode_val);
	swingmode_val->addItem(SWING_SMOOTH, "Smooth");
	bindParam(this, "scattering_x", randomx_val);
	randomx_val->getMin()->setMeasureName("fxLength");
	randomx_val->getMax()->setMeasureName("fxLength");
	randomx_val->getMin()->setValueRange(-1000., +1000.);
	randomx_val->getMax()->setValueRange(-1000., +1000.);
	bindParam(this, "scattering_y", randomy_val);
	randomy_val->getMin()->setMeasureName("fxLength");
	randomy_val->getMax()->setMeasureName("fxLength");
	randomy_val->getMin()->setValueRange(-1000., +1000.);
	randomy_val->getMax()->setValueRange(-1000., +1000.);
	bindParam(this, "scattering_x_ctrl", randomx_ctrl_val);
	bindParam(this, "scattering_y_ctrl", randomy_ctrl_val);
	bindParam(this, "swing", swing_val);
	swing_val->getMin()->setValueRange(-1000., +1000.);
	swing_val->getMax()->setValueRange(-1000., +1000.);
	speed_val->getMin()->setMeasureName("fxLength");
	speed_val->getMax()->setMeasureName("fxLength");
	bindParam(this, "speed", speed_val);
	speed_val->getMin()->setValueRange(-1000., +1000.);
	speed_val->getMax()->setValueRange(-1000., +1000.);
	bindParam(this, "speed_ctrl", speed_ctrl_val);
	bindParam(this, "speed_angle", speeda_val);
	speeda_val->getMin()->setValueRange(-1000., +1000.);
	speeda_val->getMax()->setValueRange(-1000., +1000.);
	speeda_val->getMin()->setMeasureName("angle");
	speeda_val->getMax()->setMeasureName("angle");

	bindParam(this, "speeda_ctrl", speeda_ctrl_val);
	bindParam(this, "speeda_use_gradient", speeda_use_gradient_val);

	bindParam(this, "speed_size", speedscale_val);
	bindParam(this, "top_layer", toplayer_val);
	toplayer_val->addItem(TOP_OLDER, "Older");
	toplayer_val->addItem(TOP_SMALLER, "Smaller");
	toplayer_val->addItem(TOP_BIGGER, "Bigger");
	toplayer_val->addItem(TOP_RANDOM, "Random");
	bindParam(this, "mass", mass_val);
	mass_val->getMin()->setValueRange(0., +1000.);
	mass_val->getMax()->setValueRange(0., +1000.);
	bindParam(this, "scale", scale_val);
	scale_val->getMin()->setValueRange(0., +1000.);
	scale_val->getMax()->setValueRange(0., +1000.);
	bindParam(this, "scale_ctrl", scale_ctrl_val);
	bindParam(this, "scale_ctrl_all", scale_ctrl_all_val);
	bindParam(this, "rot", rot_val);
	rot_val->getMin()->setValueRange(-1000., +1000.);
	rot_val->getMax()->setValueRange(-1000., +1000.);
	rot_val->getMin()->setMeasureName("angle");
	rot_val->getMax()->setMeasureName("angle");
	bindParam(this, "rot_ctrl", rot_ctrl_val);
	bindParam(this, "trail", trail_val);
	trail_val->getMin()->setValueRange(0., +1000.);
	trail_val->getMax()->setValueRange(0., +1000.);
	bindParam(this, "trail_step", trailstep_val);
	trailstep_val->setValueRange(1.0, (std::numeric_limits<double>::max)());
	bindParam(this, "spin_swing_mode", rotswingmode_val);
	rotswingmode_val->addItem(SWING_SMOOTH, "Smooth");
	bindParam(this, "spin_speed", rotspeed_val);
	rotspeed_val->setMeasureName("angle");
	bindParam(this, "spin_random", rotsca_val);
	rotsca_val->getMin()->setValueRange(-1000., +1000.);
	rotsca_val->getMax()->setValueRange(-1000., +1000.);
	rotsca_val->getMin()->setMeasureName("angle");
	rotsca_val->getMax()->setMeasureName("angle");
	bindParam(this, "spin_swing", rotswing_val);
	rotswing_val->getMin()->setValueRange(-1000., +1000.);
	rotswing_val->getMax()->setValueRange(-1000., +1000.);
	rotswing_val->getMin()->setMeasureName("angle");
	rotswing_val->getMax()->setMeasureName("angle");
	bindParam(this, "path_aim", pathaim_val);
	bindParam(this, "opacity", opacity_val);
	opacity_val->getMin()->setValueRange(0., +100.);
	opacity_val->getMax()->setValueRange(0., +100.);
	bindParam(this, "opacity_ctrl", opacity_ctrl_val);
	bindParam(this, "trail_opacity", trailopacity_val);
	trailopacity_val->getMin()->setValueRange(0., +100.);
	trailopacity_val->getMax()->setValueRange(0., +100.);
	bindParam(this, "scale_step", scalestep_val);
	bindParam(this, "scale_step_ctrl", scalestep_ctrl_val);
	scalestep_val->getMin()->setValueRange(-100., +100.);
	scalestep_val->getMax()->setValueRange(-100., +100.);
	bindParam(this, "fade_in", fadein_val);
	bindParam(this, "fade_out", fadeout_val);
	bindParam(this, "animation", animation_val);
	animation_val->addItem(ANIM_RANDOM, "Random Frame");
	animation_val->addItem(ANIM_CYCLE, "Column");
	animation_val->addItem(ANIM_R_CYCLE, "Column - Random Start");
	animation_val->addItem(ANIM_SR_CYCLE, "Column Swing - Random Start");
	bindParam(this, "step", step_val);
	step_val->setValueRange(1, (std::numeric_limits<int>::max)());
	TSpectrum::ColorKey colors[] = {
		TSpectrum::ColorKey(0, TPixel32::Red),
		TSpectrum::ColorKey(1, TPixel32::Red)};
	gencol_val = TSpectrumParamP(tArrayCount(colors), colors);
	bindParam(this, "birth_color", gencol_val);
	bindParam(this, "birth_color_ctrl", gencol_ctrl_val);
	bindParam(this, "birth_color_spread", gencol_spread_val);
	gencol_spread_val->setValueRange(0.0, (std::numeric_limits<int>::max)());
	bindParam(this, "birth_color_fade", genfadecol_val);
	genfadecol_val->setValueRange(0.0, 100.0);
	TSpectrum::ColorKey colors1[] = {
		TSpectrum::ColorKey(0, TPixel32::Green),
		TSpectrum::ColorKey(1, TPixel32::Green)};
	fincol_val = TSpectrumParamP(tArrayCount(colors1), colors1);
	bindParam(this, "fadein_color", fincol_val);
	bindParam(this, "fadein_color_ctrl", fincol_ctrl_val);
	bindParam(this, "fadein_color_spread", fincol_spread_val);
	fincol_spread_val->setValueRange(0.0, (std::numeric_limits<int>::max)());
	bindParam(this, "fadein_color_range", finrangecol_val);
	finrangecol_val->setValueRange(0.0, (std::numeric_limits<double>::max)());
	bindParam(this, "fadein_color_fade", finfadecol_val);
	finfadecol_val->setValueRange(0.0, 100.0);
	TSpectrum::ColorKey colors2[] = {
		TSpectrum::ColorKey(0, TPixel32::Blue),
		TSpectrum::ColorKey(1, TPixel32::Blue)};
	foutcol_val = TSpectrumParamP(tArrayCount(colors2), colors2);
	bindParam(this, "fadeout_color", foutcol_val);
	bindParam(this, "fadeout_color_ctrl", foutcol_ctrl_val);
	bindParam(this, "fadeout_color_spread", foutcol_spread_val);
	foutcol_spread_val->setValueRange(0.0, (std::numeric_limits<int>::max)());
	bindParam(this, "fadeout_color_range", foutrangecol_val);
	foutrangecol_val->setValueRange(0.0, (std::numeric_limits<double>::max)());
	bindParam(this, "fadeout_color_fade", foutfadecol_val);
	foutfadecol_val->setValueRange(0.0, 100.0);

	bindParam(this, "source_gradation", source_gradation_val);
	bindParam(this, "pick_color_for_every_frame", pick_color_for_every_frame_val);

	/*- 計算モード (背景+粒子/粒子/背景/照明された粒子) -*/
	bindParam(this, "rendermode", iw_rendermode_val);
	iw_rendermode_val->addItem(REND_PARTICLES, "Particles");
	iw_rendermode_val->addItem(REND_BG, "Background");
	iw_rendermode_val->addItem(REND_ILLUMINATED, "Illuminated");

	/*- 粒子に貼られる絵の素材 -*/
	bindParam(this, "base_ctrl", base_ctrl_val);
	bindParam(this, "curl", curl_val);
	curl_val->setValueRange(0.0, (std::numeric_limits<double>::max)());
	bindParam(this, "curl_ctrl", curl_ctrl_1_val);
	bindParam(this, "curl_ctrl_2", curl_ctrl_2_val);

	/*- 粒子敷き詰め作戦。粒子を正三角形で敷き詰めたときの、
		正三角形の一辺の長さをインチで指定する -*/
	bindParam(this, "triangleSize", iw_triangleSize);
	iw_triangleSize->setValueRange(0.1, 100);
	iw_triangleSize->setMeasureName("fxLength");

	/*- ひらひら回転 -*/
	bindParam(this, "flap_ctrl", flap_ctrl_val);
	bindParam(this, "flap_velocity", iw_flap_velocity_val);
	iw_flap_velocity_val->setValueRange(0.0, (std::numeric_limits<double>::max)());
	bindParam(this, "flap_dir_sensitivity", iw_flap_dir_sensitivity_val);
	iw_flap_dir_sensitivity_val->setValueRange(0.0, 1.0);
	/*- ひらひら粒子に照明を当てる -*/
	bindParam(this, "light_theta", iw_light_theta_val);
	iw_light_theta_val->setValueRange(-1000.0, 1000.0);
	bindParam(this, "light_phi", iw_light_phi_val);
	iw_light_phi_val->setValueRange(-1000.0, 1000.0);

	/*- 読み込みマージン -*/
	margin_val->setMeasureName("fxLength");
	bindParam(this, "margin", margin_val);
	margin_val->setValueRange(0, (std::numeric_limits<double>::max)());

	/*- 重力を徐々に与えるためのフレーム長 -*/
	bindParam(this, "gravityBufferFrame", iw_gravityBufferFrame_val);
}
示例#6
0
int intersect(const TQuadratic &q, const TSegment &s,
              std::vector<DoublePair> &intersections, bool firstIsQuad) {
  int solutionNumber = 0;

  // Note the line `a*x+b*y+c = 0` we search for solutions
  //  di a*x(t)+b*y(t)+c=0 in [0,1]
  double a = s.getP0().y - s.getP1().y, b = s.getP1().x - s.getP0().x,
         c = -(a * s.getP0().x + b * s.getP0().y);

  // se il segmento e' un punto
  if (0.0 == a && 0.0 == b) {
    double outParForQuad = q.getT(s.getP0());

    if (areAlmostEqual(q.getPoint(outParForQuad), s.getP0())) {
      if (firstIsQuad)
        intersections.push_back(DoublePair(outParForQuad, 0));
      else
        intersections.push_back(DoublePair(0, outParForQuad));
      return 1;
    }
    return 0;
  }

  if (q.getP2() - q.getP1() ==
      q.getP1() - q.getP0()) {  // the second is a segment....
    if (firstIsQuad)
      return intersect(TSegment(q.getP0(), q.getP2()), s, intersections);
    else
      return intersect(s, TSegment(q.getP0(), q.getP2()), intersections);
  }

  std::vector<TPointD> bez, pol;
  bez.push_back(q.getP0());
  bez.push_back(q.getP1());
  bez.push_back(q.getP2());

  bezier2poly(bez, pol);

  std::vector<double> poly_1(3, 0), sol;

  poly_1[0] = a * pol[0].x + b * pol[0].y + c;
  poly_1[1] = a * pol[1].x + b * pol[1].y;
  poly_1[2] = a * pol[2].x + b * pol[2].y;

  if (!(rootFinding(poly_1, sol))) return 0;

  double segmentPar, solution;

  TPointD v10(s.getP1() - s.getP0());
  for (UINT i = 0; i < sol.size(); ++i) {
    solution = sol[i];
    if ((0.0 <= solution && solution <= 1.0) ||
        areAlmostEqual(solution, 0.0, 1e-6) ||
        areAlmostEqual(solution, 1.0, 1e-6)) {
      segmentPar = (q.getPoint(solution) - s.getP0()) * v10 / (v10 * v10);
      if ((0.0 <= segmentPar && segmentPar <= 1.0) ||
          areAlmostEqual(segmentPar, 0.0, 1e-6) ||
          areAlmostEqual(segmentPar, 1.0, 1e-6)) {
        TPointD p1 = q.getPoint(solution);
        TPointD p2 = s.getPoint(segmentPar);
        assert(areAlmostEqual(p1, p2, 1e-1));

        if (firstIsQuad)
          intersections.push_back(DoublePair(solution, segmentPar));
        else
          intersections.push_back(DoublePair(segmentPar, solution));
        solutionNumber++;
      }
    }
  }

  return solutionNumber;
}
示例#7
0
int intersect(const TPointD &p1, const TPointD &p2, const TPointD &p3,
              const TPointD &p4, std::vector<DoublePair> &intersections) {
  // This algorithm is presented in Graphics Geems III pag 199

  static double Ax, Bx, Ay, By, Cx, Cy, d, f, e;
  static double x1lo, x1hi, y1lo, y1hi;

  Ax = p2.x - p1.x;
  Bx = p3.x - p4.x;

  // test delle BBox
  if (Ax < 0.0) {
    x1lo = p2.x;
    x1hi = p1.x;
  } else {
    x1lo = p1.x;
    x1hi = p2.x;
  }

  if (Bx > 0.0) {
    if (x1hi < p4.x || x1lo > p3.x) return 0;
  } else if (x1hi < p3.x || x1lo > p4.x)
    return 0;

  Ay = p2.y - p1.y;
  By = p3.y - p4.y;

  if (Ay < 0) {
    y1lo = p2.y;
    y1hi = p1.y;
  } else {
    y1lo = p1.y;
    y1hi = p2.y;
  }

  if (By > 0) {
    if (y1hi < p4.y || y1lo > p3.y) return 0;
  } else if (y1hi < p3.y || y1lo > p4.y)
    return 0;

  Cx = p1.x - p3.x;
  Cy = p1.y - p3.y;

  d = By * Cx - Bx * Cy;
  f = Ay * Bx - Ax * By;
  e = Ax * Cy - Ay * Cx;

  if (f > 0) {
    if (d < 0) return 0;

    if (!areAlmostEqual(d, f))
      if (d > f) return 0;

    if (e < 0) return 0;
    if (!areAlmostEqual(e, f))
      if (e > f) return 0;
  } else if (f < 0) {
    if (d > 0) return 0;

    if (!areAlmostEqual(d, f))
      if (d < f) return 0;

    if (e > 0) return 0;
    if (!areAlmostEqual(e, f))
      if (e < f) return 0;
  } else {
    if (d < 0 || d > 1 || e < 0 || e > 1) return 0;

    if (p1 == p2 && p3 == p4) {
      intersections.push_back(DoublePair(0, 0));
      return 1;
    }

    // Check that the segments are not on the same line.
    if (!cross(p2 - p1, p4 - p1)) {
      // Calculation of Barycentric combinations.
      double distp2p1 = norm2(p2 - p1);
      double distp3p4 = norm2(p3 - p4);

      double dist2_p3p1 = norm2(p3 - p1);
      double dist2_p4p1 = norm2(p4 - p1);
      double dist2_p3p2 = norm2(p3 - p2);
      double dist2_p4p2 = norm2(p4 - p2);

      int intersection = 0;

      // Calculation of the first two solutions.
      double vol1;

      if (distp3p4) {
        distp3p4 = sqrt(distp3p4);

        vol1 = (p1 - p3) * normalize(p4 - p3);

        if (vol1 >= 0 && vol1 <= distp3p4)  // Barycentric combinations valid
        {
          intersections.push_back(DoublePair(0.0, vol1 / distp3p4));
          ++intersection;
        }

        vol1 = (p2 - p3) * normalize(p4 - p3);

        if (vol1 >= 0 && vol1 <= distp3p4) {
          intersections.push_back(DoublePair(1.0, vol1 / distp3p4));
          ++intersection;
        }
      }

      if (distp2p1) {
        distp2p1 = sqrt(distp2p1);

        vol1 = (p3 - p1) * normalize(p2 - p1);

        if (dist2_p3p2 && dist2_p3p1)
          if (vol1 >= 0 && vol1 <= distp2p1) {
            intersections.push_back(DoublePair(vol1 / distp2p1, 0.0));
            ++intersection;
          }

        vol1 = (p4 - p1) * normalize(p2 - p1);

        if (dist2_p4p2 && dist2_p4p1)
          if (vol1 >= 0 && vol1 <= distp2p1) {
            intersections.push_back(DoublePair(vol1 / distp2p1, 1.0));
            ++intersection;
          }
      }
      return intersection;
    }
    return -1;
  }

  double par_s = d / f;
  double par_t = e / f;

  intersections.push_back(DoublePair(par_s, par_t));
  return 1;
}
示例#8
0
DoublePair TRangeParam::getValue(double frame) const
{
	return DoublePair(m_data->m_min->getValue(frame), m_data->m_max->getValue(frame));
}
示例#9
0
DoublePair TRangeParam::getDefaultValue() const
{
	return DoublePair(m_data->m_min->getDefaultValue(), m_data->m_max->getDefaultValue());
}
	ino_level_rgba()
		: m_red_in(DoublePair(
			  0.0 * ino::param_range(), 1.0 * ino::param_range())),
		  m_red_out(DoublePair(
			  0.0 * ino::param_range(), 1.0 * ino::param_range())),
		  m_red_gamma(1.0 * ino::param_range()), m_gre_in(DoublePair(
													 0.0 * ino::param_range(), 1.0 * ino::param_range())),
		  m_gre_out(DoublePair(
			  0.0 * ino::param_range(), 1.0 * ino::param_range())),
		  m_gre_gamma(1.0 * ino::param_range()), m_blu_in(DoublePair(
													 0.0 * ino::param_range(), 1.0 * ino::param_range())),
		  m_blu_out(DoublePair(
			  0.0 * ino::param_range(), 1.0 * ino::param_range())),
		  m_blu_gamma(1.0 * ino::param_range()), m_alp_in(DoublePair(
													 0.0 * ino::param_range(), 1.0 * ino::param_range())),
		  m_alp_out(DoublePair(
			  0.0 * ino::param_range(), 1.0 * ino::param_range())),
		  m_alp_gamma(1.0 * ino::param_range())

		  ,
		  m_anti_alias(true), m_ref_mode(new TIntEnumParam(0, "Red"))
	{
		addInputPort("Source", this->m_input);
		addInputPort("Reference", this->m_refer);

		bindParam(this, "red_in", this->m_red_in);
		bindParam(this, "red_out", this->m_red_out);
		bindParam(this, "red_gamma", this->m_red_gamma);
		bindParam(this, "gre_in", this->m_gre_in);
		bindParam(this, "gre_out", this->m_gre_out);
		bindParam(this, "gre_gamma", this->m_gre_gamma);
		bindParam(this, "blu_in", this->m_blu_in);
		bindParam(this, "blu_out", this->m_blu_out);
		bindParam(this, "blu_gamma", this->m_blu_gamma);
		bindParam(this, "alp_in", this->m_alp_in);
		bindParam(this, "alp_out", this->m_alp_out);
		bindParam(this, "alp_gamma", this->m_alp_gamma);

		bindParam(this, "anti_alias", this->m_anti_alias);
		bindParam(this, "reference", this->m_ref_mode);

		this->m_red_in->getMin()->setValueRange(
			0.0 * ino::param_range(), 1.0 * ino::param_range());
		this->m_red_in->getMax()->setValueRange(
			0.0 * ino::param_range(), 1.0 * ino::param_range());
		this->m_red_out->getMin()->setValueRange(
			0.0 * ino::param_range(), 1.0 * ino::param_range());
		this->m_red_out->getMax()->setValueRange(
			0.0 * ino::param_range(), 1.0 * ino::param_range());
		this->m_red_gamma->setValueRange(
			0.1 * ino::param_range(), 10.0 * ino::param_range()); /* red_gamma値 */
		this->m_gre_in->getMin()->setValueRange(
			0.0 * ino::param_range(), 1.0 * ino::param_range());
		this->m_gre_in->getMax()->setValueRange(
			0.0 * ino::param_range(), 1.0 * ino::param_range());
		this->m_gre_out->getMin()->setValueRange(
			0.0 * ino::param_range(), 1.0 * ino::param_range());
		this->m_gre_out->getMax()->setValueRange(
			0.0 * ino::param_range(), 1.0 * ino::param_range());
		this->m_gre_gamma->setValueRange(
			0.1 * ino::param_range(), 10.0 * ino::param_range()); /* gre_gamma値 */
		this->m_blu_in->getMin()->setValueRange(
			0.0 * ino::param_range(), 1.0 * ino::param_range());
		this->m_blu_in->getMax()->setValueRange(
			0.0 * ino::param_range(), 1.0 * ino::param_range());
		this->m_blu_out->getMin()->setValueRange(
			0.0 * ino::param_range(), 1.0 * ino::param_range());
		this->m_blu_out->getMax()->setValueRange(
			0.0 * ino::param_range(), 1.0 * ino::param_range());
		this->m_blu_gamma->setValueRange(
			0.1 * ino::param_range(), 10.0 * ino::param_range()); /* blu_gamma値 */
		this->m_alp_in->getMin()->setValueRange(
			0.0 * ino::param_range(), 1.0 * ino::param_range());
		this->m_alp_in->getMax()->setValueRange(
			0.0 * ino::param_range(), 1.0 * ino::param_range());
		this->m_alp_out->getMin()->setValueRange(
			0.0 * ino::param_range(), 1.0 * ino::param_range());
		this->m_alp_out->getMax()->setValueRange(
			0.0 * ino::param_range(), 1.0 * ino::param_range());
		this->m_alp_gamma->setValueRange(
			0.1 * ino::param_range(), 10.0 * ino::param_range()); /* alp_gamma値 */

		this->m_ref_mode->addItem(1, "Green");
		this->m_ref_mode->addItem(2, "Blue");
		this->m_ref_mode->addItem(3, "Alpha");
		this->m_ref_mode->addItem(4, "Luminance");
		this->m_ref_mode->addItem(-1, "Nothing");
	}