Triangle containment

Three distinct points are plotted at random on a Cartesian plane, for which -1000 ≤ x, y ≤ 1000, such that a triangle is formed.

Consider the following two triangles:

A(-340,495), B(-153,-910), C(835,-947)X(-175,41), Y(-421,-714), Z(574,-645)

It can be verified that triangle ABC contains the origin, whereas triangle XYZ does not.

Using triangles.txt (right click and ‘Save Link/Target As…’), a 27K text file containing the co-ordinates of one thousand “random” triangles, find the number of triangles for which the interior contains the origin.

NOTE: The first two examples in the file represent the triangles in the example given above.


包含原点的三角形

从笛卡尔平面中随机选择三个不同的点,其坐标均满足-1000 ≤ x, y ≤ 1000,这三个点构成一个三角形。

考虑下面两个三角形:

A(-340,495), B(-153,-910), C(835,-947)X(-175,41), Y(-421,-714), Z(574,-645)

可以验证三角形ABC包含原点,而三角形XYZ不包含原点。

在27K的文本文件triangles.txt(右击并选择“目标另存为……”)中包含了一千个“随机”三角形的坐标,找出其中包含原点在其内部的三角形的数量。

注意:文件中的前两个三角形就是上述样例。

解题

考虑了一下原点在三角形内部的三角形,原点到两个边的夹角应该有两个钝角,但是发现结果是510,表示不对,我是根据余弦定理就得costheta 这里有问题在实际中可能出现多于90度的情况然而在我计算中,我不知道怎么判断。还有个问题就是不知道我的这个想法是否有问题,下面的程序是不对的,留在这里待更改。

package Level4;import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;public class PE0102{public static void run(){int count = 0;ArrayList<int[]> list = readData();for(int i=0;i<list.size();i++){int arr[] = list.get(i);if(iscontainmentTriangle(arr)){count+=1;}if(i<10)System.out.println(iscontainmentTriangle(arr));}System.out.println(count);}// 判断原点是否在三角形内部public static boolean iscontainmentTriangle(int[] arr){int count =0;for(int i=0;i<arr.length-1;i+=2){int x1 = arr[i];int y1 = arr[i+1];for(int j=i+2;j<arr.length-1;j+=2){int x2 = arr[j];int y2 = arr[j+1];if(isObtuseAngle(x1,y1,x2,y2))count ++;if(count ==2)return true;}}return false;}// 是不是钝角public static boolean isObtuseAngle(int x1,int y1,int x2,int y2){long costheta = x1*y1 + x2*y2;if(costheta <0)return true;return false;}// 转换成整型数组public static int [] StringtoInt(String[] strArr){int[] IntArr = new int[strArr.length];for(int i=0;i<strArr.length;i++)IntArr[i] = Integer.parseInt(strArr[i]);return IntArr;}// 读取数据public static ArrayList<int[]> readData(){String filename= "src/Level4/p102_triangles.txt";ArrayList<int[]> list = new ArrayList<int[]>();try {BufferedReader bufferedReader = new BufferedReader(new FileReader(filename));String line = "";while((line=bufferedReader.readLine())!=null){String[] strArr = line.split(",");list.add(StringtoInt(strArr));}} catch (FileNotFoundException e) {// TODO Auto-generated catch block
            e.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch block
            e.printStackTrace();}return list;}public static void main(String[] args){long t0 = System.currentTimeMillis();run();long t1 = System.currentTimeMillis();long t = t1 - t0;System.out.println("running time="+t/1000+"s"+t%1000+"ms");}
}

Java Code

mathblog 中提到了根据三角形面积相等的方式求解,ABC = ABO + ACO +BCO

这里我们知道了三角形的三个点如何根据这三个点求面积,看了下面求解的方式,根据两个向量可以快速的求出向量所组成三角形的面积S= 向量交叉相乘差的绝对值的二分之一

wiki 中有说明

Java

package Level4;import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;public class PE0102{public static void run(){int count = 0;ArrayList<int[]> list = readData();for(int i=0;i<list.size();i++){int arr[] = list.get(i);if(iscontainmentTria(arr)){count+=1;}}System.out.println(count);
//        228
//        running time=0s16ms
    }// 判断原点是否在三角形内部public static boolean iscontainmentTria(int[] arr){int area = 0;int count =0;int X1 = arr[0] - arr[2];int Y1 = arr[1] - arr[3];int X2 = arr[4] - arr[2];int Y2 = arr[5] - arr[3];int area2 = area(X1,Y1,X2,Y2);for(int i=0;i<arr.length-1;i+=2){int x1 = arr[i];int y1 = arr[i+1];for(int j=i+2;j<arr.length-1;j+=2){int x2 = arr[j];int y2 = arr[j+1];area +=area(x1,y1,x2,y2);}}if(area == area2)return true;return false;}// 这里面积的二倍public static int area(int X1,int Y1,int X2,int Y2){int area = Math.abs(X1*Y2 - X2*Y1);return area;}// 转换成整型数组public static int [] StringtoInt(String[] strArr){int[] IntArr = new int[strArr.length];for(int i=0;i<strArr.length;i++)IntArr[i] = Integer.parseInt(strArr[i]);return IntArr;}// 读取数据public static ArrayList<int[]> readData(){String filename= "src/Level4/p102_triangles.txt";ArrayList<int[]> list = new ArrayList<int[]>();try {BufferedReader bufferedReader = new BufferedReader(new FileReader(filename));String line = "";while((line=bufferedReader.readLine())!=null){String[] strArr = line.split(",");list.add(StringtoInt(strArr));}} catch (FileNotFoundException e) {// TODO Auto-generated catch block
            e.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch block
            e.printStackTrace();}return list;}public static void main(String[] args){long t0 = System.currentTimeMillis();run();long t1 = System.currentTimeMillis();long t = t1 - t0;System.out.println("running time="+t/1000+"s"+t%1000+"ms");}
}

Python

# coding=gbkimport time as time
import re
import math
import numpy as np
def run():filename = 'E:/java/projecteuler/src/Level4/p102_triangles.txt'mat = readData(filename)mat = np.array(mat)count = 0for line in mat:if isContainmentTraingle(line):count+=1print count def isContainmentTraingle(triangle):X1 = triangle[0] - triangle[2]Y1 = triangle[1] - triangle[3]X2 = triangle[4] - triangle[2]Y2 = triangle[5] - triangle[3]S = area(X1,Y1,X2,Y2)for i in range(0,4,2):for j in range(i+2,5,2):S -= area(triangle[i],triangle[i+1],triangle[j],triangle[j+1])return S == 0def area(x1,y1,x2,y2):S = np.abs(x1*y2 - x2*y1)return Sdef readData(filename):mat = list()file = open(filename)for line in file:row = line.split(',')row = [int(x) for x in row]mat.append(row)return mat t0 = time.time()
run()
t1 = time.time()
print "running time=",(t1-t0),"s"

转载于:https://www.cnblogs.com/theskulls/p/5137927.html

Project Euler 102:Triangle containment 包含原点的三角形相关推荐

  1. 欧拉计划(project euler)最详细中文题解

    欧拉计划是一个在线解题网站,题目以各类数学问题为主,通常需要结合一定的数学与编程知识,写出适当的程序求解问题(详细介绍可以参见我的文章).相比于力扣等刷题网站,欧拉计划上的题目有着更丰富的知识背景,在 ...

  2. [Project Euler] 来做欧拉项目练习题吧: 题目012

      [Project Euler] 来做欧拉项目练习题吧: 题目012 周银辉 问题描述: The sequence of triangle numbers is generated by addin ...

  3. 【AlgorithmTraining】03:Project Euler 03

    Project Euler 03 OVERVIEW Project Euler 03 1.E22:Name score 2.E32:Pandigital products 3.E33:Digit ca ...

  4. 硬币游戏 Project Euler 232

    原帖:http://hi.baidu.com/atyuwen/blog/item/160bd024531e3034c995591d.html Project Euler上最近的题目都还比较意思,来看看 ...

  5. [Project Euler] 来做欧拉项目练习题吧: 题目004

        [Project Euler] 来做欧拉项目练习题吧: 题目004 周银辉 问题描述: A palindromic number reads the same both ways. The l ...

  6. [Project Euler] 来做欧拉项目练习题吧: 题目017

    [Project Euler] 来做欧拉项目练习题吧: 题目017 周银辉 题目描述: If the numbers 1 to 5 are written out in words: one, two ...

  7. Project Euler

    最近发现了一个很有趣的网站,Project Euler 上面全是数学题,不过大多需要用编程解决 Problem 3: 求:600851475143的最大素因子. 解:编了个程序,迅速水过,看官方的题解 ...

  8. Project Euler Problem 27小结

    Project Euler上有很多有意思的问题,刚做到第27题,对这个问题做个小结. Problem 27: Euler有一个著名的方程n^2+n+41,当n=0到39时,方程结果均为质数.如今人们用 ...

  9. Project Euler Problem 104 Pandigital Fibonacci ends

    Pandigital Fibonacci ends Problem 104 The Fibonacci sequence is defined by the recurrence relation: ...

最新文章

  1. 5G NGC — PCF 策略控制功能
  2. ELK集群的搭建和Elasticsearchd api的简单使用
  3. 项目开发时前端及数据库遇到的问题
  4. 傻瓜式的php+mysql伪静态(真实存在的html页面)
  5. 网络排错模型之我见----模型,基线,协议,数据包
  6. Windows 2003 系统管理 视频教程 http://www.91xueit.comm 下载
  7. 使用撤回流RetractStream的场景
  8. java 不能继承的类_java中不能继承的类有哪些?
  9. 深入浅出 python epub_《机器学习从认知到实践(第2辑)(套装共3册,Python+TensorFlow)》epub+mobi+azw3...
  10. 跟着百度学PHP[4]OOP面对对象编程-16-switch逻辑就语句
  11. 再见了,收费的XShell,我改用国产良心工具!
  12. 寄存器与七种寻址方式
  13. MySQL · Semi-join原理及源码分析
  14. ubuntu 16 xenial EKL安装
  15. centos 8 使用 nmcli 配置网桥Bridge(最后有踩坑过程)
  16. WARN [AdminClient clientId=adminclient-1] Connection to node -1 (localhost/127.0.0.1:9092) could not
  17. 计算机导论基础论文3000字,计算机导论课论文3000字
  18. 苹果痛下狠手,全面禁止App内部的广告拦截软件
  19. Java基础之面向对象部分详解
  20. 1 交换机的基本配置与管理

热门文章

  1. C++中用TinyXML对XML文件进行解析
  2. DBSCAN聚类(code)
  3. 华为nova7保密柜_华为nova8系列发布 Vlog视频旗舰3299元起
  4. linux网络适配器驱动程序怎么安装,英特尔?服务器适配器 — Linuxixgbe* 基础驱动程序概述和安装...
  5. python从html中提取文本_使用Python从HTML中提取可读文本?
  6. 苹果手机关闭自动更新_苹果手机会quot;偷钱quot;的2个功能,越早关闭越好,不然经常无故被扣钱...
  7. 电容器在电路中的作用
  8. 设计模式之十二:组合模式(composite)
  9. VS2012下基于Glut OpenGL GL_POLYGON示例程序:
  10. 一般将来时语法课教案_初中英语笔试教案模板