qsc52(三角形线性插值)

题目链接:http://qscoj.cn/problem/52/

题意:中文题诶~

思路:水题,只要知道三角形插值和判断点在三角形内就OK了

关于三角形插值:http://www.cnblogs.com/wangchengfeng/p/3453194.html

先判断插入点是否在三角形内,在的话解二元一次方程组:

P.x = (1 - u - v) * P1.x + u * P2.x + v * P3.x

P.y = (1 - u - v) * P1.y + u * P2.y + v * P3.y

再将u, v代入:P = (1 - u - v) * P1 + u * P2 + v * P3

P就是答案了

代码:

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <math.h>
 4 using namespace std;
 5
 6 const double res=1e-6;
 7 struct node{
 8     double x, y;
 9 };
10
11 double get_area(node a, node b, node c){ //***用行列式计算三角形面积
12     double area=fabs(a.x*b.y+a.y*c.x+b.x*c.y-a.x*c.y-a.y*b.x-b.y*c.x);
13     return area;
14 }
15
16 bool is_ok(node p1, node p2, node p3, node p){//***判断点p是否在三角形内
17     double areap=get_area(p1, p2, p);
18     areap+=get_area(p1, p3, p);
19     areap+=get_area(p2, p3, p);
20     double area=get_area(p1, p2, p3);
21     if(fabs(areap-area)<res){
22         return true;
23     }else{
24         return false;
25     }
26 }
27
28 int main(void){
29     double x1, y1, w1, x2, y2, w2, x3, y3, w3, x, y;
30     while(cin >> x1 >> y1 >> w1 >> x2 >> y2 >> w2 >> x3 >> y3 >> w3 >> x >> y){
31         node p1, p2, p3, p;
32         p1.x=x1, p1.y=y1;
33         p2.x=x2, p2.y=y2;
34         p3.x=x3, p3.y=y3;
35         p.x=x, p.y=y;
36         if(!is_ok(p1, p2, p3, p)){
37             cout << -1 << endl;
38             continue;
39         }
40         double a1=x2-x1, b1=x3-x1, c1=x-x1;
41         double a2=y2-y1, b2=y3-y1, c2=y-y1;
42         double u=(b1*c2-b2*c1)/(a2*b1-a1*b2);
43         double v=(c1-a1*u)/b1;
44         double ans=(1-u-v)*w1+u*w2+v*w3;
45         printf("%.2lf\n", ans);
46     }
47 }

时间: 2024-08-12 22:07:11

qsc52(三角形线性插值)的相关文章

线性插值&amp;双线性插值&amp;三线性插值

http://www.cnblogs.com/yingying0907/archive/2012/11/21/2780092.html 內插是数学领域数值分析中的通过已知的离散数据求未知数据的过程或方法. 根据若干离散的数据,得到一个连续的函数(也就是曲线)或者更加密集的离散方程与已知数据相吻合.这个过程叫做拟合.內插是曲线必须通过已知点的拟合. 1.线性插值 已知坐标 (x0, y0) 与 (x1, y1),要得到 [x0, x1] 区间内某一位置 x 在直线上的值. 由于 x 值已知,所以可

[转]线性插值&amp;双线性插值&amp;三线性插值

转自:http://www.cnblogs.com/yingying0907/archive/2012/11/21/2780092.html 內插是数学领域数值分析中的通过已知的离散数据求未知数据的过程或方法. 根据若干离散的数据数据,得到一个连续的函数(也就是曲线)或者更加密集的离散方程与已知数据相吻合.这个过程叫做拟合.內插是曲线必须通过已知点的拟合. 1.线性插值 已知坐标 (x0, y0) 与 (x1, y1),要得到 [x0, x1] 区间内某一位置 x 在直线上的值. 由于 x 值已

Unity3D中的线性插值Lerp()函数解析

转自:http://www.aichengxu.com/view/2446604 在unity3D中经常用线性插值函数Lerp()来在两者之间插值,两者之间可以是两个材质之间.两个向量之间.两个浮点数之间.两个颜色之间,其函数原型如下: 1.Material.Lerp 插值 function Lerp(start : Material, end : Material, t : float) : void 在两个材质之间插值 2.Vector2.Lerp 插值 static functionLer

OpenGL学习脚印: 绘制一个三角形

写在前面 接着上一节内容,开发环境搭建好后,我们当然想立即编写3D应用程序了.不过我们还需要些耐心,因为OpenGL是一套底层的API,因而我们要掌握的基本知识稍微多一点,在开始绘制3D图形之前,本节我们将通过绘制一个三角形的程序来熟悉现代OpenGL的概念和流程. 通过本节可以了解到: 缓存对象VAO和VBO GLSL着色器程序的编译.链接和使用方法 OpenGL绘图的基本流程 绘图流水线简要了解 与使用高级绘图API(例如java里swing绘图,MFC里的绘图)不同,使用OpenGL绘制图

DirectX学习笔记(五):利用平面着色和Gouraud着色模式绘制具有颜色的三角形

前言: 图元的颜色是由构成该图元的顶点的颜色所决定的,而物体是由图元索组成.那么如果我们要绘制一个具有颜色的三角形,我们就需要为三角形图元顶点附加颜色属性. 1.Direct3D中颜色的表示: 在Direct3D中,颜色用RGB来表示(这个大家都知道,咳咳.)通畅人为颜色可以分为红色(red).绿色(green).蓝色(bule).这三个分量进行混合,以达到我们想要的颜色取得目的.RGB的数据可以用两种方式来进行存储一种是D3DCOLOR ,另一种是:DWORD.这是因为D3DCOLOR完全等同

二维图像的三角形变换算法解释

http://blog.csdn.net/aqua_aqua/article/details/407660 对于二维图像的变形,最简单直接的方式就是将需要变形的不规则区域进行三角形划分,使复杂多边形由1到N个三角形组成,那么最终的变形动作也就转化为这些三角形变形. 三角形变形,就是将一个三角形通过某种变换变成另一个三角形,同时也要保证在源三角形中的点能够正确映射到目标三角形中合适的位置.如下图所示: 图中△ABC是源三角形,Z点是源三角形中的任意一点.△abc为目标三角形,而z点就是源三角形中Z

BZOJ2458 [BeiJing2011]最小三角形

Description Xaviera现在遇到了一个有趣的问题. 平面上有N个点,Xaviera想找出周长最小的三角形. 由于点非常多,分布也非常乱,所以Xaviera想请你来解决这个问题. 为了减小问题的难度,这里的三角形也包括共线的三点. Input 第一行包含一个整数N表示点的个数. 接下来N行每行有两个整数,表示这个点的坐标. Output 输出只有一行,包含一个6位小数,为周长最短的三角形的周长(四舍五入). Sample Input 4 1 1 2 3 3 3 3 4 Sample

Directx11学习笔记【十】 画一个简单的三角形

本篇笔记要实现的是在屏幕上渲染出一个三角形,重点要学习的是渲染一个几何体的流程方式. 为了渲染几何图形,需要一个顶点缓存和一个描述顶点布局的输入层,还有着色器(主要是顶点着色器和像素着色器),下面来看看具体Demo的实现. 新建一个Win32项目 ,新建一个类我们叫做TriangleDemo,继承自前面教程我们实现的基类Dx11DemoBase. TriangleDemo.h头文件 #pragma once #include "Dx11DemoBase.h" class Triangl

数字三角形

数字三角形必须经过某一个点,使之走的路程和最大 输入格式: 第1行n,表示n行 (n<=25), 第2到n+1行为每个的权值,第n+2行为两个数x,y表示必须经过的点 输出格式: 输出最大值 样例1 输入: 2 1 1 1 1 1 输出: 2 //11 月 23 日 2015 #include <stdio.h> int num[26][26];//存储数字三角形的权值 int route[26][2];//记录临时最优路径 int n; int s1,s2;//以特殊点分为上半段和下半