Example #1
0
        /**
         * Intersect
         *
         * @param ray
         * @param pt
         * @return boolean
         */
        public override bool Intersect(Ray ray, IntersectPt pt)
        {
            double vd = Normal.Dot(ray.GetDirection());
            double vo, t;
            Vector origVec = new Vector(ray.GetOrigin().GetX(), ray.GetOrigin().GetY(), ray.GetOrigin().GetZ());

            if (vd == 0.0f)
            {
                return(false);
            }
            vo = -Normal.Dot(origVec) - D;
            t  = vo / vd;
            if (t < pt.GetThreshold())
            {
                return(false);
            }
            pt.GetIntersection().Combine(ray.GetOrigin(), ray.GetDirection(), 1.0f, t);
            if (!Check(ray, pt))
            {
                return(false);
            }
            pt.SetT(t);
            pt.SetIntersectObj(this);
            if (GetObjID() == pt.GetOriginal())
            {
                pt.SetEnter(false);
            }
            else
            {
                pt.SetEnter(true);
            }
            GetCachePt().Set(ray.GetID(), pt);
            return(true);
        }
Example #2
0
    /**
     * Intersect
     *
     * @param ray
     * @param pt
     * @return boolean
     */
    public override bool Intersect(Ray ray, IntersectPt pt)
    {
        Vector OC = new Vector();
        double l2OC, tCA, t2HC;

        OC.Sub(Origin, ray.GetOrigin());
        l2OC = OC.SquaredLength();
        tCA  = OC.Dot(ray.GetDirection());
        if (l2OC >= RadiusSquare && tCA <= 0)
        {
            return(false);
        }
        t2HC = RadiusSquare - l2OC + tCA * tCA;
        if (t2HC < 0)
        {
            return(false);
        }
        if (l2OC <= RadiusSquare)
        {
            pt.SetT(tCA + (double)System.Math.Sqrt(t2HC));
            if (pt.GetT() < pt.GetThreshold())
            {
                return(false);
            }
            pt.SetEnter(false);
            pt.GetIntersection().Combine(ray.GetOrigin(), ray.GetDirection(), 1.0f, pt.GetT());
        }
        else
        {
            pt.SetT(tCA - (double)System.Math.Sqrt(t2HC));
            pt.SetEnter(true);
            if (pt.GetT() < pt.GetThreshold())
            {
                pt.SetT(tCA + (double)System.Math.Sqrt(t2HC));
                pt.SetEnter(false);
            }
            pt.GetIntersection().Combine(ray.GetOrigin(), ray.GetDirection(), 1.0f, pt.GetT());
        }
        pt.SetIntersectObj(this);
        GetCachePt().Set(ray.GetID(), pt);
        return(true);
    }
Example #3
0
    /**
     * FindLightBlock
     *
     * @param tree
     * @param ray
     * @param maxt
     * @return boolean
     */
    private bool FindLightBlock(OctNode tree, Ray ray, double maxt)
    {
        OctNode     current = tree.FindTreeNode(ray.GetOrigin());
        IntersectPt test    = new IntersectPt();
        Point       testpt  = new Point();

        while (current != null)
        {
            ObjNode currentnode = current.GetList();
            while (currentnode != null)
            {
                bool found = false;
                if (currentnode.GetObj().GetCachePt().GetID() == ray.GetID())
                {
                    found = true;
                }
                if (!found)
                {
                    test.SetOrigID(0);
                    if (currentnode.GetObj().Intersect(ray, test))
                    {
                        if (test.GetT() < maxt)
                        {
                            return(true);
                        }
                    }
                }
                currentnode = currentnode.Next();
            }
            OctNode adjacent = current.Intersect(ray, testpt, test.GetThreshold());
            if (adjacent == null)
            {
                current = null;
            }
            else
            {
                current = adjacent.FindTreeNode(testpt);
            }
        }
        return(false);
    }
Example #4
0
	/**
	 * Intersect
	 *
	 * @param ray
	 * @param pt
	 * @return boolean
	 */
	public override bool Intersect(Ray ray, IntersectPt pt)
	{
		double vd = Normal.Dot(ray.GetDirection());
		double vo, t;
		Vector origVec = new Vector(ray.GetOrigin().GetX(), ray.GetOrigin().GetY(), ray.GetOrigin().GetZ());

		if(vd == 0.0f)
		{
			return (false);
		}
		vo = -Normal.Dot(origVec) - D;
		t = vo / vd;
		if(t < pt.GetThreshold())
		{
			return (false);
		}
		pt.GetIntersection().Combine(ray.GetOrigin(), ray.GetDirection(), 1.0f, t);
		if(!Check(ray, pt))
		{
			return (false);
		}
		pt.SetT(t);
		pt.SetIntersectObj(this);
		if(GetObjID() == pt.GetOriginal())
		{
			pt.SetEnter(false);
		}
		else
		{
			pt.SetEnter(true);
		}
		GetCachePt().Set(ray.GetID(), pt);
		return (true);
	}
Example #5
0
	/**
	 * Intersect
	 *
	 * @param ray
	 * @param pt
	 * @return boolean
	 */
	public override bool Intersect(Ray ray, IntersectPt pt)
	{
		Vector OC = new Vector();
		double l2OC, tCA, t2HC;

		OC.Sub(Origin, ray.GetOrigin());
		l2OC = OC.SquaredLength();
		tCA = OC.Dot(ray.GetDirection());
		if(l2OC >= RadiusSquare && tCA <= 0)
		{
			return (false);
		}
		t2HC = RadiusSquare - l2OC + tCA * tCA;
		if(t2HC < 0)
		{
			return (false);
		}
		if(l2OC <= RadiusSquare)
		{
			pt.SetT(tCA + (double)System.Math.Sqrt(t2HC));
			if(pt.GetT() < pt.GetThreshold())
			{
				return (false);
			}
			pt.SetEnter(false);
			pt.GetIntersection().Combine(ray.GetOrigin(), ray.GetDirection(), 1.0f, pt.GetT());
		}
		else
		{
			pt.SetT(tCA - (double)System.Math.Sqrt(t2HC));
			pt.SetEnter(true);
			if(pt.GetT() < pt.GetThreshold())
			{
				pt.SetT(tCA + (double)System.Math.Sqrt(t2HC));
				pt.SetEnter(false);
			}
			pt.GetIntersection().Combine(ray.GetOrigin(), ray.GetDirection(), 1.0f, pt.GetT());
		}
		pt.SetIntersectObj(this);
		GetCachePt().Set(ray.GetID(), pt);
		return (true);
	}
Example #6
0
	/**
	 * FindLightBlock
	 *
	 * @param tree
	 * @param ray
	 * @param maxt
	 * @return boolean
	 */
	private bool FindLightBlock(OctNode tree, Ray ray, double maxt)
	{
		OctNode current = tree.FindTreeNode(ray.GetOrigin());
		IntersectPt test = new IntersectPt();
		Point testpt = new Point();

		while(current != null)
		{
			ObjNode currentnode = current.GetList();
			while(currentnode != null)
			{
				bool found = false;
				if(currentnode.GetObj().GetCachePt().GetID() == ray.GetID())
				{
					found = true;
				}
				if(!found)
				{
					test.SetOrigID(0);
					if(currentnode.GetObj().Intersect(ray, test))
					{
						if(test.GetT() < maxt)
						{
							return (true);
						}
					}
				}
				currentnode = currentnode.Next();
			}
			OctNode adjacent = current.Intersect(ray, testpt, test.GetThreshold());
			if(adjacent == null)
			{
				current = null;
			}
			else
			{
				current = adjacent.FindTreeNode(testpt);
			}
		}
		return (false);
	}