UVa 10112 - Myacm Triangles

题目:给你平面上的4-15个点,让你找到面积最大的三角形,三角形中不能有其他点。

分析:计算几何。因为数据较小直接枚举所有情况,找到符合题意最大的即可。

            判断点在三角形内的犯法很多,我之前一直用,判断点在边的同侧的方法(向量)。

            这里利用白书中方法,判断O在△ABC中的方法:S△ABC = S△ABO + S△AOC + S△OBC

            这里的面积是大小,不是向量,取绝对值计算。

说明:注意库( ⊙ o ⊙ )啊!白CE了一次。

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cmath>

using namespace std;

typedef struct pnode
{
	char name;
	int  x,y;
}point;
point P[20];

int Area( point a, point b, point c )
{
	return abs((b.x-a.x)*(c.y-a.y)-(c.x-a.x)*(b.y-a.y));
}

int main()
{
	int n;
	while ( cin >> n && n ) {
		for ( int i = 0 ; i < n ; ++ i )
			cin >> P[i].name >> P[i].x >> P[i].y;
		
		int Max = 0,a = 0,b = 1,c = 2;
		for ( int i =  0  ; i < n ; ++ i )
		for ( int j = i+1 ; j < n ; ++ j )
		for ( int k = j+1 ; k < n ; ++ k ) {
			int flag = 1;
			int temp,area = Area( P[i], P[j], P[k] );
			for ( int p = 0 ; p < n ; ++ p ) {
				if ( p == i || p == j || p == k )
					continue;
				temp  = Area( P[p], P[j], P[k] );
				temp += Area( P[i], P[p], P[k] );
				temp += Area( P[i], P[j], P[p] );
				if ( temp == area ) {
					flag = 0;
					break;
				}
			}
			if ( flag && Max < area ) {
				a = i; b = j; c = k;
				Max = area;
			}
		}
		
		printf("%c%c%c\n",P[a].name,P[b].name,P[c].name);	
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
bool Accel::travel(Node* treeNode, const Ray3f& ray_, Intersection& its, bool shadowRay, uint32_t& hitIdx) const { Ray3f ray(ray_); //与该节点包围盒不相交 cout << "与该节点包围盒求交" << endl; if (!treeNode->bbox.rayIntersect(ray)) { cout << "与该节点包围盒不相交" << endl; return false; } cout << "与该节点包围盒相交" << endl; bool is_hit = false; //是叶子节点 if (treeNode->is_leaf) { cout << "叶子节点" << endl; cout << "叶子节点内三角形数目:" << treeNode->triangles.size() << endl; //与叶子节点内三角形求交 for (size_t i = 0; i < treeNode->triangles.size(); i++) { //与叶子节点内第i个三角形求交 int index = i; cout << "与叶子节点内第" << index << "个三角形求交" << endl; float u, v, t; if (m_mesh->rayIntersect(treeNode->triangles[index], ray, u, v, t) && t < ray.maxt) { //与叶子节点内第i个三角形相交,更新交点 cout << "与叶子节点内第" << i << "个三角形相交,更新交点" << endl; if (shadowRay) return true; ray.maxt = t; its.t = t; its.uv = Point2f(u, v); its.mesh = m_mesh; hitIdx = treeNode->triangles[index]; is_hit = true; } } cout << endl; } //不是叶子节点 else { cout << "非叶子节点" << endl; for (size_t i = 0; i < 8; i++) { //与该节点第i个子节点求交 int index = i; cout << "与该节点第" << index << "个子节点求交" << endl; is_hit = travel(treeNode->child[index], ray, its, shadowRay, hitIdx); } } return is_hit; }
最新发布
07-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值