Problem:
MathJax.Hub.Config({ tex2jax: { inlineMath: [["$","$"], ["\\(","\\)"]], processEscapes: true }});

A Point in a Triangle

There is a triangle formed by three points $(x_1, y_1)$, $(x_2, y_2)$, $(x_3, y_3)$ on a plain.

Write a program which prints "YES" if a point $P$ $(x_p, y_p)$ is in the triangle and "NO" if not.

Input

Input consists of several datasets. Each dataset consists of:

$x_1$ $y_1$ $x_2$ $y_2$ $x_3$ $y_3$ $x_p$ $y_p$

All the input are real numbers. Input ends with EOF. The number of datasets is less than or equal to 100.

Constraints

You can assume that:

$ -100 \leq x_1, y_1, x_2, y_2, x_3, y_3, x_p, y_p \leq 100$

1.0 $\leq$ Length of each side of a tringle

0.001 $\leq$ Distance between $P$ and each side of a triangle

Output

For each dataset, print "YES" or "NO" in a line.

Sample Input

0.0 0.0 2.0 0.0 2.0 2.0 1.5 0.5
0.0 0.0 1.0 4.0 5.0 3.0 -1.0 3.0

Output for the Sample Input

YES
NO

Solution in JAVA (judge verdict: Accepted)

import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Main
{
	public static void main(String[] arg) throws IOException
	{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		String s;
		while((s=br.readLine())!=null){
			double x1 = Double.parseDouble(s.split(" ")[0]);
			double y1 = Double.parseDouble(s.split(" ")[1]);
			double x2 = Double.parseDouble(s.split(" ")[2]);
			double y2 = Double.parseDouble(s.split(" ")[3]);
			double x3 = Double.parseDouble(s.split(" ")[4]);
			double y3 = Double.parseDouble(s.split(" ")[5]);
			double xp = Double.parseDouble(s.split(" ")[6]);
			double yp = Double.parseDouble(s.split(" ")[7]);
			if(inTriangle(x1,y1,x2,y2,x3,y3,xp,yp))
				System.out.println("YES");
			else 	
				System.out.println("NO");
		}
	}
	private static boolean inTriangle(double x1, double y1, double x2, double y2, double x3, double y3, double xp, double yp)
	{
		// equation -> y = [0]x + [1]
		double[] eq12 = new double[2];
		double[] eq13 = new double[2];
		double[] eq23 = new double[2];
		
		if((x2-x1)==0) eq12[0]=(y2-y1);
		else eq12[0] = (y2-y1) / (x2-x1);
		eq12[1] = y1 - x1 * eq12[0];
		if((x3-x1)==0) eq13[0]=(y3-y1);
		else eq13[0] = (y3-y1) / (x3-x1);
		eq13[1] = y1 - x1 * eq13[0];
		if((x3-x2)==0) eq23[0]=(y3-y2);		
		else eq23[0] = (y3-y2) / (x3-x2);
		eq23[1] = y2 - x2 * eq23[0];
		
		if(yp > (eq12[0] * xp + eq12[1])) {
			if(y3 < (eq12[0] * x3 + eq12[1])) return false;
		} else if(y3 > (eq12[0] * x3 + eq12[1])) return false;
		if(yp > (eq13[0] * xp + eq13[1])) {
			if(y2 < (eq13[0] * x2 + eq13[1])) return false;
		} else if(y2 > (eq13[0] * x2 + eq13[1])) return false;
		if(yp > (eq23[0] * xp + eq23[1])) {
			if(y1 < (eq23[0] * x1 + eq23[1])) return false;
		} else if(y1 > (eq23[0] * x1 + eq23[1])) return false;
		return true;
	}
}