使用C++的if循环写一个计算三角形面积的程序
时间: 2023-03-15 16:33:31 浏览: 94
#include <stdio.h>
int main()
{
float a, b, c, s, area; printf("输入三角形的边长:\n");
scanf("%f%f%f", &a, &b, &c); /* 计算半周长 */
s = (a + b + c) / 2; /* 计算面积 */
area = sqrt(s * (s - a) * (s - b) * (s - c)); printf("三角形的面积为 %f \n", area); return 0;
}
相关问题
使用glfw写一个颜色渐变的三角形
下面是使用glfw和OpenGL ES写一个颜色渐变的三角形的示例代码:
```c++
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <GLES3/gl3.h>
#include <GLFW/glfw3.h>
const GLchar* vertexShaderSource =
"#version 300 es\n"
"layout(location = 0) in vec3 position;\n"
"layout(location = 1) in vec4 color;\n"
"out vec4 vertexColor;\n"
"void main()\n"
"{\n"
" gl_Position = vec4(position, 1.0);\n"
" vertexColor = color;\n"
"}\0";
const GLchar* fragmentShaderSource =
"#version 300 es\n"
"precision mediump float;\n"
"in vec4 vertexColor;\n"
"out vec4 FragColor;\n"
"void main()\n"
"{\n"
" FragColor = vertexColor;\n"
"}\n\0";
GLfloat vertices[] = {
-0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f,
0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f,
0.0f, 0.5f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f
};
int main()
{
GLFWwindow* window;
GLuint vertexShader, fragmentShader, shaderProgram, VBO, VAO;
// 初始化glfw
if (!glfwInit()) {
fprintf(stderr, "Failed to initialize GLFW\n");
return -1;
}
// 创建窗口
window = glfwCreateWindow(800, 600, "Color Triangle", NULL, NULL);
if (!window) {
glfwTerminate();
fprintf(stderr, "Failed to create window\n");
return -1;
}
// 设置OpenGL上下文
glfwMakeContextCurrent(window);
// 初始化GLEW
if (glewInit() != GLEW_OK) {
fprintf(stderr, "Failed to initialize GLEW\n");
return -1;
}
// 定义顶点着色器
vertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);
glCompileShader(vertexShader);
// 检查编译状态
GLint success;
GLchar infoLog[512];
glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success);
if (!success) {
glGetShaderInfoLog(vertexShader, 512, NULL, infoLog);
fprintf(stderr, "Error compiling vertex shader: %s\n", infoLog);
return -1;
}
// 定义片段着色器
fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);
glCompileShader(fragmentShader);
// 检查编译状态
glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success);
if (!success) {
glGetShaderInfoLog(fragmentShader, 512, NULL, infoLog);
fprintf(stderr, "Error compiling fragment shader: %s\n", infoLog);
return -1;
}
// 定义着色器程序
shaderProgram = glCreateProgram();
glAttachShader(shaderProgram, vertexShader);
glAttachShader(shaderProgram, fragmentShader);
glLinkProgram(shaderProgram);
// 检查链接状态
glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);
if (!success) {
glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog);
fprintf(stderr, "Error linking shader program: %s\n", infoLog);
return -1;
}
// 删除着色器对象
glDeleteShader(vertexShader);
glDeleteShader(fragmentShader);
// 定义顶点缓冲对象和顶点数组对象
glGenBuffers(1, &VBO);
glGenVertexArrays(1, &VAO);
// 绑定顶点数组对象和顶点缓冲对象
glBindVertexArray(VAO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
// 定义顶点属性指针
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 7 * sizeof(GLfloat), (GLvoid*)0);
glEnableVertexAttribArray(0);
glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 7 * sizeof(GLfloat), (GLvoid*)(3 * sizeof(GLfloat)));
glEnableVertexAttribArray(1);
// 取消绑定
glBindVertexArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
// 渲染循环
while (!glfwWindowShouldClose(window)) {
// 处理事件
glfwPollEvents();
// 清空屏幕
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
// 使用着色器程序
glUseProgram(shaderProgram);
// 绑定顶点数组对象
glBindVertexArray(VAO);
// 绘制三角形
glDrawArrays(GL_TRIANGLES, 0, 3);
// 取消绑定
glBindVertexArray(0);
// 交换缓冲区
glfwSwapBuffers(window);
}
// 删除顶点数组对象和顶点缓冲对象
glDeleteVertexArrays(1, &VAO);
glDeleteBuffers(1, &VBO);
// 终止glfw
glfwTerminate();
return 0;
}
```
这个代码定义了一个顶点着色器和一个片段着色器,将它们编译成一个着色器程序。接着定义三个顶点和对应的颜色,并将它们存储在一个顶点缓冲对象中。最后,在渲染循环中绑定顶点数组对象和顶点缓冲对象,并使用着色器程序来绘制一个三角形。
写一个光追里射线和三角形求交的代码
以下是一个简单的光追里射线和三角形求交的代码,使用了C++语言和OpenGL库。
首先,我们需要定义一个射线类(Ray),包含起点(origin)和方向向量(direction):
```c++
class Ray {
public:
vec3 origin;
vec3 direction;
Ray(vec3 o, vec3 d) {
origin = o;
direction = d;
}
};
```
接下来,我们定义一个三角形类(Triangle),包含三个点(p1, p2, p3),以及计算法向量(normal)的方法:
```c++
class Triangle {
public:
vec3 p1, p2, p3;
vec3 normal;
Triangle(vec3 v1, vec3 v2, vec3 v3) {
p1 = v1;
p2 = v2;
p3 = v3;
normal = normalize(cross(p2 - p1, p3 - p1));
}
bool intersect(Ray ray, float& t) {
vec3 e1 = p2 - p1;
vec3 e2 = p3 - p1;
vec3 h = cross(ray.direction, e2);
float a = dot(e1, h);
if (a > -EPSILON && a < EPSILON) {
return false;
}
float f = 1.0 / a;
vec3 s = ray.origin - p1;
float u = f * dot(s, h);
if (u < 0.0 || u > 1.0) {
return false;
}
vec3 q = cross(s, e1);
float v = f * dot(ray.direction, q);
if (v < 0.0 || u + v > 1.0) {
return false;
}
t = f * dot(e2, q);
if (t > EPSILON) {
return true;
}
return false;
}
};
```
在上面的代码中,我们使用了Möller–Trumbore算法来判断射线和三角形是否相交。如果相交,则返回交点到射线起点的距离t。
最后,我们可以使用以下代码来进行光追,求出光线和三角形的交点:
```c++
float intersect(Ray ray, Triangle triangle) {
float t;
if (triangle.intersect(ray, t)) {
return t;
}
return INFINITY;
}
vec3 trace(Ray ray) {
float tmin = INFINITY;
Triangle* hitTriangle = nullptr;
for (auto triangle : triangles) {
float t = intersect(ray, triangle);
if (t < tmin) {
tmin = t;
hitTriangle = ▵
}
}
if (hitTriangle == nullptr) {
return vec3(0, 0, 0);
}
vec3 hitPoint = ray.origin + tmin * ray.direction;
vec3 normal = hitTriangle->normal;
return normal;
}
```
在上面的代码中,我们首先循环遍历所有的三角形,找到距离射线起点最近的交点,并记录下该三角形。如果没有找到交点,则返回黑色(vec3(0, 0, 0)),表示没有照到任何物体。
然后,我们计算交点的法向量,并将其作为颜色返回。在这个简单的光追场景中,我们只考虑了漫反射,因此直接使用法向量作为颜色。在实际的光追中,我们需要考虑多种反射和折射的情况,需要使用更加复杂的光学模型来计算颜色。
完整代码如下:
相关推荐
![](https://img-home.csdnimg.cn/images/20210720083646.png)
![](https://img-home.csdnimg.cn/images/20210720083646.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)