2017-07-23 09:30:42 nijiayan123 阅读数 517
  • Qt项目实战之网络电子白板

    本课程使用Qt技术实现了网络电子白板,支持直线、矩形、椭圆、三角形、涂鸦等图形元素。本课程实现的电子白板,可以在多人之间共享,每个人都可以进行任意绘制,每个人的绘制都可以同步显示在其它人的白板上。服务器端使用Qt Network开发,客户端使用Qt Network和Qt Graphics View Framework开发,数据传输使用JSON数据格式。

    11393 人正在学习 去看看 安晓辉

最近在看mesh网格参数化的相关论文,发现里面有一些基础的关于三角形的基础知识。所以整理一下防止以后再遇到又要一个个单独的找。

1.已知三角形三个顶点求三角形面积

先介绍一下三维中的两点之间距离之式,

和二维的几乎一样:

d = sqrt((x0-x1)^2 + (y0-y1)^2 + (z0-z1)^2) 

现在介绍叉乘,

叉乘在定义上有:两个向量进行叉乘得到的是一个向量,方向垂直于这两个向量构成的平面,大小等于这两个向量组成的平行四边形的面积。在直角座标系[O;i,j,k]中,i、、k分别为X轴、Y轴、Z轴上向量的单位向量。设P0(0,0,0),P1(x1,y1,z1),P2(x2,y2,z2)。因为是从原点出发,所以向量P0P1可简记为P1,向量P0P2可简记为P2。依定义有:

                  |i  j  k | 

P1×P2 = |x1 y1 z1| 

                |x2 y2 z2| 

展开,得到:上式

 = iy1z2 + jz1x2 + kx1y2 - ky1x2 - jx1z2 - iz1y2  

 = (y1z2 - y2z1)i + (x2z1 - x1z2)j + (x1y2 - x2y1)k 

按规定,有:单位向量的模为1。可得叉积的模为:|P1×P2| = y1z2 - y2z1 + x2z1 - x1z2 + x1y2 - x2y1 

 = (y1z2 + x2z1 + x1y2) - (y2z1 + x1z2 + x2y1) 

开始正式内容。我们设三角形的三个顶点为A(x0,y0,z0),B(x1,y1,z1),C(x2,y2,z2)。我们将三角形的两条边AB和AC看成是向量。然后,我们以A为原点,进行坐标平移,向量B(x1-x0,y1-y0,z1-z0),向量C(x2-x0,y2-y0,z2-z0)。①在三维的情况下,直接代入公式,可得向量B和向量C叉乘结果的模为:

|B×C| = ((y1-y0)*(z2-z0) + (z1-z0)*(x2-x0) + (x1-x0)*(y2-y0)) - ((y2-y0)*(z1-z0) + (z2-z0)*(x1-x0) + (x2-x0)*(y1-y0)) 

     |   1     1         1       | 

 = |x1-x0 y1-y0 z1-z0|

    |x2-x0 y2-y0 z2-z0| 

它的一半即为所要求的三角形面积S。

先介绍一下叉乘的概念,两个向量ab的叉乘写作a×b(有时也被写成ab,避免和字母x混淆)。
向量积可以被定义为:
模长:(在这里θ表示两向量之间的夹角(共起点的前提下)(0° ≤ θ ≤ 180°),它位于这两个矢量所定义的平面上。)
方向:a向量与b向量的向量积的方向与这两个向量所在平面垂直,且遵守右手定则。(一个简单的确定满足“右手定则”的结果向量的方向的方法是这样的:若坐标系是满足右手定则的,当右手的四指从a以不超过180度的转角转向b时,竖起的大拇指指向是c的方向。)
也可以这样定义(等效):
向量积|c|=|a×b|=|a| |b|sin<a,b>
c的长度在数值上等于以ab,夹角为θ组成的平行四边形的面积。
c的方向垂直于a与b所决定的平面,c的指向按右手定则从a转向b来确定。
*运算结果c是一个伪向量。这是因为在不同的坐标系中c可能不同。

坐标运算

  
=(
  
),
  
=(
  
)。i,j,k分别是X,Y,Z轴方向的单位向量,则:
a×b=(
  
-
  
)i+(
  
-
  
)j+(
  
-
  
)k,为了帮助记忆,利用三阶行列式写成det
 

[O;i,j,k]中,ijk分别为X轴、Y轴、Z轴上向量的单位向量。P0(0,0,0)P1(x1,y1,z1)P2(x2,y2,z2)因为是从原点出发,所以向量P0P1可简记为P1,向量P0P2可简记P2。依定义有:在直角座标系[O;i,j,k]中,ijk分别为X轴、Y轴、Z轴上向量的单位向量。P0(0,0,0)P1(x1,y1,z1)P2(x2,y2,z2)因为是从原点出发,所以向量P0P1可简记为P1,向量P0P2可简记为P2。依定义有:

因此在三角形中假设三角形三个顶点坐标是A(a1,b1,c1),B(a2,b2.c2),C(a3.b3.c3).所以可以得到两个两个向量 AB=(a2-a1,b2-b1,c2-c1),AC(a3-a1,b3-b1,c3-c1).按上面叉乘的结构我们计算AB×AC。可以得到一个(b2-b1)*(c3-c1)+(c2-c1)*(a3-a1)+(a2-a1)*(b3-b1)-(b3-b1)*(c2-c1)-(c3-c1)*(a2-a1)-(a3-a1)*(b2-b1).
因为这是一个平行四边形的面积。所以它的一半就是三角形的面积。
2 给定一点判断改点是否在这个三角形内
除了上述求面积以外,还有一种常用的就是判断一个点是否在一个三角形内。这种方法就多一些。
1,内角法。
把这个点的和三角形的三个顶点连接气起来然后判断三个夹角的和是不是180度。如果180度则说明是在三角形内部,否则在外面。

2 面积法
如上图所示把点连接起来然后按照上面求面积的方法求出。三个小三角形的面积。然后在求出大三角形的面积判断这两个面积是否一样。如果大小一样则说明点在三角形内。
3 向量法
这种方法也是比较简单的方法。我们可以观察上面点P可以发现它在直接BC的上方,在AB的右边,在AC的左边。
在上述的求面积中使用了叉乘的公式。我们可以发现。AB × AP = |AB| * |AP| * sin∠PAB P在AB的左边,则∠PAB在0°到180°之间   sin∠PAB > 0 P在AB右边时,则∠PAB在-180°到0°之间 sin∠PAB < 0 因此,我们只要用AB和AP的叉积的正负,就可以判断P和AB的相对位置(AP相对AB是顺时针还是逆时针旋转)。所以利用这个性质我们就可以判断点是否在三角形内。当然这要进行三次判断。
在求得向量以后判断三词。最后结果在同一个方向,即要是大于0所有都大于0这样就可以进行判断了。
4 叉乘法
沿着三角形的边按顺时针方向走,判断该点是否在每条边的右边(这可以通过叉乘判断),如果该点在每条边的右边,则在三角形内,否则在三角形外。这个算法只用到了三次叉乘,没有除法运算和三角函数、开根号等运算,所以效率很高,而且精度很高(没有浮点误差)。 

设三角形三点A(x1,y1)B(x2,y2)C(x3,y3),已知点M(x,y), 

1,先求出三个向量MA,MB,MC.  

2,计算MA X MB,MB X MC,MC X MA (X表叉乘) 

3,如果此三组的向量叉乘的结果都是同号的(或都正,或都负),即方向相同的,则说明点M在三角形每条边的同侧,即内部。否则必在外部! 

2017-11-26 21:49:11 wynplay 阅读数 341
  • Qt项目实战之网络电子白板

    本课程使用Qt技术实现了网络电子白板,支持直线、矩形、椭圆、三角形、涂鸦等图形元素。本课程实现的电子白板,可以在多人之间共享,每个人都可以进行任意绘制,每个人的绘制都可以同步显示在其它人的白板上。服务器端使用Qt Network开发,客户端使用Qt Network和Qt Graphics View Framework开发,数据传输使用JSON数据格式。

    11393 人正在学习 去看看 安晓辉

题目:

输入三个正整数,判断能否构成三角形的三边,如果不能,输出“NO”。如果能构成三角形,判断构成什么三角形?按等边、直角、一般三角形分类,依次输出对应的三角形类型“Equilateral”、“Right”、“General”。

输入:

输入一行三个用空格隔开的正整数a,b,c,表示三角形的三条边长。

输出:

输出对应三角形的类型,如果不能构成三角形,输出“NO”,如果是等边三角形输出“Equilateral”,如果是直角三角形输出“Right”,其他三角形则输出“General”。

样例:

3 4 5

Right

分析:

首先知道判断三角形成立的基本条件,任意两边之和大于第三边。或者是任意两边之差小于第三边。

#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
int main(){
    int a, b, c;
    cin>>a>>b>>c;
    if(a + b > c && a + c > b && b + c >a){
        if((a == b) && (b == c)){
            cout<<"Equilateral"<<endl;
        }else if((a * a + b * b == c * c) || (a * a +c * c == b * b) || (b * b + c * c == a * a)){
            cout<<"Right"<<endl;
        }else {
            cout<<"General"<<endl;
        }
    } else{
        cout<<"NO"<<endl;
    }
    return 0;
}
2017-03-28 20:59:00 weixin_30734435 阅读数 6
  • Qt项目实战之网络电子白板

    本课程使用Qt技术实现了网络电子白板,支持直线、矩形、椭圆、三角形、涂鸦等图形元素。本课程实现的电子白板,可以在多人之间共享,每个人都可以进行任意绘制,每个人的绘制都可以同步显示在其它人的白板上。服务器端使用Qt Network开发,客户端使用Qt Network和Qt Graphics View Framework开发,数据传输使用JSON数据格式。

    11393 人正在学习 去看看 安晓辉

题目描述

输入三个正整数,判断能否构成三角形的三边,如果不能,输出“NO”。如果能构成三角形,判断构成什么三角形?按等边、直角、一般三角形分类,依次输出对应的三角形类型“Equilateral”、“Right”、“General”。

输入

输入一行三个用空格隔开的正整数a,b,c,表示三角形的三条边长。

输出

输出对应三角形的类型,如果不能构成三角形,输出“NO”,如果是等边三角形输出“Equilateral”,如果是直角三角形输出“Right”,其他三角形则输出“General”。

样例输入

3 4 5

样例输出

Right

数据范围限制

1<=a,b,c<=1000

来源/作者: CCF中学生计算机程序设计入门篇练习3.3.2

所有管理员添加的题目 使用此版权/授权形式

#include<iostream>
#include<cmath>
#include<cstdio>
#include<algorithm>
using namespace std;
int tot=0;
double ans;
int a[4];
int main()
{
    cin>>a[1]>>a[2]>>a[3];
    sort(a+1,a+4);
    //cout<<a[1]<<a[2]<<a[3];
    int b=a[2];
    int c=a[3];
    if(a[1]+b>c)
    {
        if(a[1]*a[1]+b*b==c*c)
        {
            cout<<"Right";
            return 0;
        }
        else if(a[1]==b&&b==c)
        {
            cout<<"Equilateral";
            return 0;
        }
        else
        {
            cout<<"General";
            return 0;
        }
    }
    else
    {
        cout<<"NO";
    }
    return 0;
}

 

转载于:https://www.cnblogs.com/zwfymqz/p/6636834.html

2018-12-08 09:57:46 weixin_43379056 阅读数 317
  • Qt项目实战之网络电子白板

    本课程使用Qt技术实现了网络电子白板,支持直线、矩形、椭圆、三角形、涂鸦等图形元素。本课程实现的电子白板,可以在多人之间共享,每个人都可以进行任意绘制,每个人的绘制都可以同步显示在其它人的白板上。服务器端使用Qt Network开发,客户端使用Qt Network和Qt Graphics View Framework开发,数据传输使用JSON数据格式。

    11393 人正在学习 去看看 安晓辉

1013. 识别三角形

题目描述

输入三个正整数,判断能否构成三角形的三边,如果不能,输出“NO”。如果能构成三角形,判断构成什么三角形?按等边、直角、一般三角形分类,依次输出对应的三角形类型“Equilateral”、“Right”、“General”。

输入

输入一行三个用空格隔开的正整数a,b,c,表示三角形的三条边长。

输出

输出对应三角形的类型,如果不能构成三角形,输出“NO”,如果是等边三角形输出“Equilateral”,如果是直角三角形输出“Right”,其他三角形则输出“General”。

样例输入

3 4 5

样例输出

Right

数据范围限制

1<=a,b,c<=1000

C++ 代码

#include <iostream>
#include <cassert>

using namespace std;

int main()
{
    int a, b, c;

    cin >> a >> b >> c;

    assert(a>=1 && a<=1000);
    assert(b>=1 && b<=1000);
    assert(c>=1 && c<=1000);

    if (!(a+b>c && a+c>b && c+b>a))
    {
        cout << "NO" << endl;
        return 0;
    }

    if (a == b && b == c)
    {
        cout << "Equilateral" << endl;
    }
    else
    {
        if ((a*a == b*b + c*c) ||
           (b*b == a*a + c*c) ||
           (c*c == a*a + b*b))
        {
            cout << "Right" << endl;
        }
        else
        {
            cout << "General" << endl;
        }
    }

    return 0;
}

2017-04-20 08:52:27 tigerisland45 阅读数 1460
  • Qt项目实战之网络电子白板

    本课程使用Qt技术实现了网络电子白板,支持直线、矩形、椭圆、三角形、涂鸦等图形元素。本课程实现的电子白板,可以在多人之间共享,每个人都可以进行任意绘制,每个人的绘制都可以同步显示在其它人的白板上。服务器端使用Qt Network开发,客户端使用Qt Network和Qt Graphics View Framework开发,数据传输使用JSON数据格式。

    11393 人正在学习 去看看 安晓辉

问题链接CCF NOI1013 识别三角形




时间限制: 1000 ms  空间限制: 262144 KB

题目描述

  输入三个正整数,判断能否构成三角形的三边,如果不能,输出“NO”。如果能构成三角形,判断构成什么三角形?按等边、直角、一般三角形分类,依次输出对应的三角形类型“Equilateral”、“Right”、“General”。

输入

  输入一行三个用空格隔开的正整数a,b,c,表示三角形的三条边长。

输出

  输出对应三角形的类型,如果不能构成三角形,输出“NO”,如果是等边三角形输出“Equilateral”,如果是直角三角形输出“Right”,其他三角形则输出“General”。

样例输入

3 4 5

样例输出

Right

数据范围限制

  1<=a,b,c<=1000



问题分析

  这是一个判定问题,根据输入的3个值判定三角形。

  需要对三角形有关的概念和定义十分清楚才行。

程序说明

  程序中,对于输入的值进行了交换,可以极大地简化三角形判断逻辑。

要点详解
  • 一个复杂的计算,不是直接处理,而是分步进行处理,每一步的逻辑都变得简单,整体的处理逻辑也简化了。



100分通过的C语言程序:

#include <stdio.h>

int main(void)
{
    int a, b, c, temp;

    scanf("%d%d%d", &a, &b, &c);

    // 进行值交换,使得c为最大
    if(a > c && a > b) {
        temp = a;
        a = c;
        c = temp;
    } else if(b > a && b > c) {
        temp = b;
        b = c;
        c = temp;
    }

    // 进行三角形判定
    if(a + b > c) {
        if(a == b && b == c)
            printf("Equilateral\n");
        else if(a * a + b * b == c * c)
            printf("Right\n");
        else
            printf("General\n");
    } else
        printf("NO\n");

    return 0;
}



图像处理笔试题

阅读数 7003

没有更多推荐了,返回首页