OpenGL(C++):求两向量角平分线

前提条件:两向量起点在同一个点

设两向量分别为 O A ⃗ \vec{OA} OA O B ⃗ \vec{OB} OB ,起点均在 O O O点。

主要思想:

O A ⃗ \vec{OA} OA O B ⃗ \vec{OB} OB 单位化,假设求得单位向量分别为: a ⃗ \vec{a} a b ⃗ \vec{b} b 。则 a ⃗ \vec{a} a + b ⃗ \vec{b} b 即为角平分线所在向量。

主要代码:

注意:函数最后返回的是角平分线所在向量,起点在中心点O(center)位置,不在原点(0,0),所以使用OpenGL绘制角平分线的代码时起点是O(center),终点是角平分线所在向量上的任一点
//数据结构point,用来存储点和向量的信息
struct point {
   GLfloat x;
   GLfloat y;
};

//函数传入的是点A(left), O(center), B(right)的坐标
point Angle_bisector(point left, point center, point right) {

   //角平分线:将左右两向量单位化,然后相加求得的就是角平分线所在方向
   
   //a是左边向量
   point a;
   a.x = (left.x - center.x);
   a.y = (left.y - center.y);
   
   //b是右边向量
   point b;
   b.x = (right.x - center.x);
   b.y = (right.y - center.y);
   
   //求a,b的模长分别为ad和bd
   GLfloat ad, bd;
   ad = sqrt(pow(a.x, 2) + pow(a.y, 2));
   bd = sqrt(pow(b.x, 2) + pow(b.y, 2));
   
   //将 a, b单位化
   a.x = a.x / ad;
   a.y /= ad;
   b.x /= bd;
   b.y /= bd;
   
   //abs用来存储角平分线所在向量
   point abs;
   abs.x = a.x + b.x;
   abs.y = a.y + b.y;

   cout << "a + b = " << "(" << abs.x << "," << abs.y << ")" << endl;

   return abs;
}

完整代码:

注意:我是用GLUT库写的代码,大家可以直接看上面的主要代码。还有一个就是下面的代码是找出一个正方形(只要满足简单凸多边形应该都可以,大家可以自己改一下试试)各顶点的角平分线向量
#include <GL/glut.h>
#include <GL/GL.h>
#include <iostream>
#include <math.h>

using namespace std;

struct point {
	GLfloat x;
	GLfloat y;
};

point Points[4] = { {20, -20}, {20, 20}, {-20, 20}, {-20, -20} };	//用来存储多边形的顶点,一个正方形
point Abs[4];	//用来存储每个顶点的角平分线向量


//计算每个顶点的角平分线向量
point Angle_bisector(point left, point center, point right) {

	//角平分线:将左右两向量单位化,然后相加求得的就是角平分线所在方向

	point a;
	a.x = (left.x - center.x);
	a.y = (left.y - center.y);

	point b;
	b.x = (right.x - center.x);
	b.y = (right.y - center.y);

	GLfloat ad, bd;
	ad = sqrt(pow(a.x, 2) + pow(a.y, 2));
	bd = sqrt(pow(b.x, 2) + pow(b.y, 2));

	a.x = a.x / ad;
	a.y /= ad;
	b.x /= bd;
	b.y /= bd;

	point abs;
	abs.x = a.x + b.x;
	abs.y = a.y + b.y;

	cout << "a + b = " << "(" << abs.x << "," << abs.y << ")" << endl;

	return abs;
}


void display(void) {
	point abs;
	glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glLineWidth(2.0f);
	glColor3f(0.0f, 0.0f, 0.0f);
	glBegin(GL_LINE_LOOP);
	for (int i = 0; i < 4; i++) {
		glVertex3f(Points[i].x, Points[i].y, 0);
		if (i == 0) {
			abs = Angle_bisector(Points[4 - 1], Points[0], Points[1]);
		}
		else if (i == 4 - 1) {
			abs = Angle_bisector(Points[4 - 2], Points[4 - 1], Points[0]);
		}
		else {
			abs = Angle_bisector(Points[i - 1], Points[i], Points[i + 1]);
		}
		Abs[i] = abs;
	}
	glEnd();

	glLineWidth(2.0f);
	glBegin(GL_LINES);
	glColor3f(0.0, 1.0, 0.0);
	for (int i = 0; i < 4; i++) {
		//cout << Abs[i].x <<","<< Abs[i].y << endl;
		glVertex3f(Points[i].x, Points[i].y, 0);
		//*10是为了放大向量,以便于查看绘画效果
		//原先这里写的是glVertex3f(10 * Abs[i].x, 10 * Abs[i].y, 0);,这样写不对,因为Abs向量的起点不在原点
		glVertex3f(Points[i].x + 10 * Abs[i].x, Points[i].y + 10 * Abs[i].y, 0);
	}
	glEnd();
	
	glutSwapBuffers();
}


void reshpae(int w, int h) {
	glViewport(0, 0, w, h);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	glOrtho(-100, 100, -100, 100, 10.0, -10.0);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
}

int main(int argc, char* argv[]) {

	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE);
	glutInitWindowPosition(100, 100);
	glutInitWindowSize(500, 500);
	glutCreateWindow("求简单凸多边形各顶点角平分线向量");
	glutDisplayFunc(display);
	glutReshapeFunc(reshpae);
	glutMainLoop();
	return 0;
}

运行效果

在这里插入图片描述

参考资料:

怎么求两向量的角平分线向量

  • 0
    点赞
  • 2
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

打赏
文章很值,打赏犒劳作者一下
相关推荐
©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页

打赏

学习中的胡图图

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者