UE4精品課程 | OpenGL學習筆記(三)繪製三角形/四邊形

2021-02-21 晶核資訊

本文轉載於拉Box小能手知乎作者

原文連結:https://zhuanlan.zhihu.com/p/72497359

本文為學習LearnOpenGL的學習筆記,如有書寫和理解錯誤還請大佬扶正;

教程連結:

https://link.zhihu.com/?target=https%3A//learnopengl-cn.github.io/01%2520Getting%2520started/04%2520Hello%2520Triangle/

一,基礎概念

1,圖形渲染管線

在OpenGL中,任何事物都在3D空間中,而屏幕和窗口卻是2D像素數組,這導致OpenGL的大部分工作都是關於把3D坐標轉變為適應你屏幕的2D像素。3D坐標轉為2D坐標的處理過程是由OpenGL的圖形渲染管線(Graphics Pipeline)管理的。圖形渲染管線可以被劃分為兩個主要部分:

第一部分把你的3D坐標轉換為2D坐標;

第二部分是把2D坐標轉變為實際的有顏色的像素;

2,著色器

圖形渲染管線可以被劃分為幾個階段,每個階段將會把前一個階段的輸出作為輸入。所有這些階段都是高度專門化的(都有一個特定的函數),並且很容易並行執行。正是由於它們具有並行執行的特性,當今大多數顯卡都有成千上萬的小處理核心,它們在GPU上為每一個(渲染管線)階段運行各自的小程序,從而在圖形渲染管線中快速處理你的數據。這些小程序叫做著色器(Shader)。

3,渲染管線的幾個階段

渲染管線

首先,我們以數組的形式傳遞3個3D坐標作為圖形渲染管線的輸入,用來表示一個三角形,這個數組叫做頂點數據(Vertex Data);頂點數據是一系列頂點的集合。一個頂點(Vertex)是一個3D坐標的數據的集合。而頂點數據是用頂點屬性(Vertex Attribute)表示的;

頂點著色器(Vertex Shader),把一個單獨的頂點作為輸入。頂點著色器主要的目的是把3D坐標轉為另一種3D坐標(後面會學到),同時頂點著色器允許我們對頂點屬性進行一些基本處理;

圖元裝配(Primitive Assembly)階段將頂點著色器輸出的所有頂點作為輸入並所有的點裝配成指定圖元的形狀;

為了讓OpenGL知道我們的坐標和顏色值構成的到底是什麼,OpenGL需要你去指定這些數據所表示的渲染類型。我們是希望把這些數據渲染成一系列的點?一系列的三角形?還是僅僅是一個長長的線?做出的這些提示叫做圖元(Primitive),任何一個繪製指令的調用都將把圖元傳遞給OpenGL。這是其中的幾個:GL_POINTS、GL_TRIANGLES、GL_LINE_STRIP。OpenGL中的一個片段是OpenGL渲染一個像素所需的所有數據;

片段著色器的主要目的是計算一個像素的最終顏色,這也是所有OpenGL高級效果產生的地方。通常,片段著色器包含3D場景的數據(比如光照、陰影、光的顏色等等),這些數據可以被用來計算最終像素的顏色;

Alpha測試和混合(Blending)階段。這個階段檢測片段的對應的深度(和模板(Stencil))值,用它們來判斷這個像素是其它物體的前面還是後面,決定是否應該丟棄。這個階段也會檢查alpha值(alpha值定義了一個物體的透明度)並對物體進行混合(Blend);

在現代OpenGL中,我們必須定義至少一個頂點著色器和一個片段著色器(因為GPU中沒有默認的頂點/片段著色器),幾何著色器是可選的,其他使用默認著色器;

二,繪製三角形步驟

1,定義頂點數據數組

2,創建,綁定VAO (Vertex Array Object)頂點數組對象 管理頂點屬性

1,創建VAO;glGenVertexArrays(1, &VAO);

2,綁定VAO;glBindVertexArray(VAO);

3,如需多個VAO 創建VAO數組 VAOs[n],glGenVertexArrays(n,VAOs),並分別進行綁定 glBindVertexArray(VAOs[1]) ;

3,創建,綁定VBO(Vertex Buffer Objects)頂點緩衝對象 管理頂點數據儲存的內存

1,創建VBO; glGenBuffer(1,&VBO);

2,綁定VBO; glBindBuffer(GL_ARRAY_BUFFER,VBO);

(OpenGL允許我們同時綁定多個緩衝,只要它們是不同的緩衝類型。我們可以使用glBindBuffer函數把新創建的緩衝綁定到GL_ARRAY_BUFFER目標上)

3,把頂點數據拷貝到VBO緩衝內存中; glBufferData(...);

4,如需多個VBO 創建VBO數組 VBOs[n];glGenVertexArrays(n,VBOs),並分別進行綁定 glBindBuffer(GL_ARRAY_BUFFER, VBOs[1]) ;

只有VBO時VAO存儲

3(1)創建,綁定EBO(ElementBuffer Objects/Index Buffer Object)索引緩衝對象 管理頂點數據儲存的內存

1,創建EBO;glGenBuffers(1, &EBO);

2,綁定EBO;glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);

3,如需多個EBO 創建EBO數組 EBOs[n];glGenBuffers(n,EBOs),並分別進行綁定 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBOs[1]) ;

VBO與EBO同時存儲VAO中

4,連結頂點屬性 設置頂點屬性指針

5,定義頂點著色器

1,聲明所用的OpenGL版本號以及模塊;#Version 330 core;

2,聲明用來接收頂點數據的變量以及位置;in vec3 aPos/Location;

3,簡單的賦值;預定義變量gl_Position;

6,編譯頂點著色器

1,創建頂點著色器對象;glCreateShader(CL_VERTEX_SHADER);

2,把定義的著色器源碼附加到頂點著色器對象上;glShaderSource(...);

3,編譯著色器;glCompileShader(VertexShader);

4,檢查是否編譯成功,並列印信息;glGetShaderriv();

7,定義片源著色器

8,編譯片源著色器

1,創建片源著色器對象;glCreateShader(GL_FRAGMENT_SHADER);

2,把定義片源著色器源碼附加到片源著色器對象上;glShaderSource(...);

3,編譯著色器;glCompileShader(fragmentShader);

4,檢查是否編譯成功,並列印信息;glGetShaderriv();

9,連結著色器程序

1,創建連結著色程序;glCreateProgram();

2,把之前的頂點與片源綁定到連結程序上;glAttachShader(..);

3,連結編譯;glLinkProgram(shaderProgram);

4,檢查連結編譯是否成功,並列印信息;glGetProgramInfoLog(...);

5,激活程序對象(一般放在渲染循環裡);glUseProgram(shaderProgram);

6,渲染繪製;glDrawArrays(...);;

7,刪除創建的著色器;glDeleteShader(vertexShader/fragmentShader);

效果預覽

效果預覽

完整的代碼及注釋:

後續學習會把著色器代碼進行封裝,優化代碼;

此時的頂點輸入均在標準化坐標系之內(範圍xyz均在[-1,1]),因為OpenGl頂點數據僅在此範圍坐標才會顯示在屏幕上;(正常坐標要經過變換到達標準化坐標系)

//GLAD的頭文件包含了正確的OpenGL頭文件(例如GL/gl.h),所以需要在其它依賴於OpenGL的頭文件之前包含GLAD。
#include <glad/glad.h>
#include <GLFW/glfw3.h>
#include <iostream>
using namespace std;

/*******************************************定義常量************************************************/
//設置窗口的寬和高
const unsigned int SCR_WIDTH = 800;
const unsigned int SCR_HEIGHT = 600;
/*******************************************函數************************************************/
//響應鍵盤輸入事件
//ESC推出窗口
void processInput(GLFWwindow* window)
{
if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
{
glfwSetWindowShouldClose(window, true);
}
}

//當用戶改變窗口的大小的時候,視口也應該被調整。
//對窗口註冊一個回調函數(Callback Function),它會在每次窗口大小被調整的時候被調用
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{
//glViewport函數前兩個參數控制窗口左下角的位置。第三個和第四個參數控制渲染窗口的寬度和高度(像素)
glViewport(0, 0, width, height);
}

/*******************************************頂點與片源著色器************************************************/

//定義頂點與片源著色器的函數字符串
const char *vertexShaderSource = "#version 330 core\n"
"layout (location = 0) in vec3 aPos;\n"
"void main()\n"
"{\n"
" gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);\n"
"}\0";
//第一個片源著色器代碼
const char *fragmentShaderSource = "#version 330 core\n"
"out vec4 FragColor;\n"
"void main()\n"
"{\n"
" FragColor = vec4(0.0f, 0.0f, 1.0f, 1.0f);\n"
"}\n\0";

//第二個片源著色器代碼
//賦予不同的顏色
const char *fragmentShaderSource01 = "#version 330 core\n"
"out vec4 FragColor;\n"
"void main()\n"
"{\n"
" FragColor = vec4(1.0f, 0.0f, 0.0f, 1.0f);\n"
"}\n\0";

/*******************************************主函數************************************************/
//主函數
int main()
{
//初始化GLFW
glfwInit();
//聲明版本與核心
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); //主版本號
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); //次版本號
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
//創建窗口並設置其大小,名稱,與檢測是否創建成功
GLFWwindow* window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "LearnOpenGL", nullptr, nullptr);
if (window == nullptr)
{
cout << "Failed to create GLFW window" << endl;
glfwTerminate();
return -1;
}

//創建完畢之後,需要讓當前窗口的環境在當前線程上成為當前環境,就是接下來的畫圖都會畫在我們剛剛創建的窗口上
glfwMakeContextCurrent(window);
//告訴GLFW我們希望每當窗口調整大小的時候調用這個函數
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);

//glad尋找opengl的函數地址,調用opengl的函數前需要初始化glad
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
{
std::cout << "Failed to initialize GLAD" << std::endl;
return -1;
}

//構建和編譯Shader

//頂點Shader
//創建頂點著色器對象
int vertexShader = glCreateShader(GL_VERTEX_SHADER);
//著色器源碼附加到對象上,然後編譯
glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);
glCompileShader(vertexShader);

// 檢查是否編譯成功
int success; //int 類型標識是否成功
char infoLog[512];//儲存錯誤消息的容器
//glGetShaderiv()檢查是否編譯成功
glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success);
if (!success)
{
//glGetShaderInfoLog()獲取錯誤消息,然後列印它。
glGetShaderInfoLog(vertexShader, 512, NULL, infoLog);
std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog << std::endl;
}


//片源Shader
//創建第一個片源著色器對象
int 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);
std::cout << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n" << infoLog << std::endl;
}

//創建第二個片源著色器對象
int fragmentShader01 = glCreateShader(GL_FRAGMENT_SHADER);
////著色器源碼附加到對象上,然後編譯
glShaderSource(fragmentShader01, 1, &fragmentShaderSource01, NULL);
glCompileShader(fragmentShader01);
// 檢查是否編譯成功
glGetShaderiv(fragmentShader01, GL_COMPILE_STATUS, &success);
if (!success)
{
glGetShaderInfoLog(fragmentShader01, 512, NULL, infoLog);
std::cout << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n" << infoLog << std::endl;
}

//連結Shader,連結頂點與片源
//創建第一個連結對象
int shaderProgram = glCreateProgram();
//著色器附加到了程序上,然後用glLinkProgram連結
glAttachShader(shaderProgram, vertexShader);
glAttachShader(shaderProgram, fragmentShader);
glLinkProgram(shaderProgram);

//檢查是否連結出錯
glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);
if (!success) {
glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog);
std::cout << "ERROR::SHADER::PROGRAM::LINKING_FAILED\n" << infoLog << std::endl;
}
//把著色器對象連結到程序對象以後,刪除著色器對象,不再需要它們
//glDeleteShader(vertexShader);
glDeleteShader(fragmentShader);

//創建連結第二個著色器
int shaderProgram01 = glCreateProgram();
//著色器附加到了程序上,然後用glLinkProgram連結
glAttachShader(shaderProgram01, vertexShader);
glAttachShader(shaderProgram01, fragmentShader01);
glLinkProgram(shaderProgram01);

//檢查是否連結出錯
glGetProgramiv(shaderProgram01, GL_LINK_STATUS, &success);
if (!success) {
glGetProgramInfoLog(shaderProgram01, 512, NULL, infoLog);
std::cout << "ERROR::SHADER::PROGRAM::LINKING_FAILED\n" << infoLog << std::endl;
}
//把著色器對象連結到程序對象以後,刪除著色器對象,不再需要它們
glDeleteShader(vertexShader);
glDeleteShader(fragmentShader01);

//設置頂點數據和頂點屬性和索引
float vertices01[] = {
// 第一個四邊形
0.1f, 0.9f, 0.0f,
0.9f, 0.9f, 0.0f,
0.9f, 0.1f, 0.0f,
0.1f, 0.1f, 0.0f,
};
//索引
unsigned int indices[] = {
0, 1, 3,
1, 2, 3
};
float vertices02[] = {
// 第二個三角形
-0.5f, 0.9f, 0.0f,
-0.1f, 0.1f, 0.0f,
-0.9f, 0.1f, 0.0f,
};

//創建 VBO 頂點緩衝對象 VAO頂點數組對象 EBO索引緩衝對象
//多個對象
unsigned int VBOs[2], VAOs[2], EBO;
glGenVertexArrays(2, VAOs);
glGenBuffers(2, VBOs);
glGenBuffers(1, &EBO);

//第一個
//綁定VAO,VBO與EBO對象
glBindVertexArray(VAOs[0]);
glBindBuffer(GL_ARRAY_BUFFER, VBOs[0]);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);

//複製頂點數據到緩衝內存中
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices01), vertices01, GL_STATIC_DRAW);

// 賦值頂點索引到緩衝內存中
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);

//連結頂點屬性,設置頂點屬性指針
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
//以頂點屬性位置值作為參數,啟用頂點屬性;頂點屬性默認是禁用的。
glEnableVertexAttribArray(0);


//第二個
//綁定第二個VAO,VBO與EBO對象
glBindVertexArray(VAOs[1]);
glBindBuffer(GL_ARRAY_BUFFER, VBOs[1]);


//複製頂點數據到緩衝內存中
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices02), vertices02, GL_STATIC_DRAW);

//連結頂點屬性,設置頂點屬性指針
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
//以頂點屬性位置值作為參數,啟用頂點屬性;頂點屬性默認是禁用的。
glEnableVertexAttribArray(0);

/*******************************************渲染循環************************************************/



//glfwWindowShouldClose()檢查窗口是否需要關閉。如果是,遊戲循環就結束了,接下來我們將會清理資源,結束程序
while (!glfwWindowShouldClose(window))
{
//響應鍵盤輸入
processInput(window);

//設置清除顏色
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
//清除當前窗口,把顏色設置為清除顏色
glClear(GL_COLOR_BUFFER_BIT);

//激活連結程序,激活著色器,開始渲染
glUseProgram(shaderProgram);
//綁定VAO
glBindVertexArray(VAOs[0]);
//繪製四邊形
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);

//繪製第二個三角形
glUseProgram(shaderProgram01);
glBindVertexArray(VAOs[1]);
glDrawArrays(GL_TRIANGLES, 0, 3);

//線框繪製
//glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);

//交換顏色緩衝
glfwSwapBuffers(window);
//處理事件
glfwPollEvents();
}

//解除綁定
glDeleteVertexArrays(2, VAOs);
glDeleteBuffers(2, VBOs);
glDeleteBuffers(1, &EBO);

//釋放前面所申請的資源
glfwTerminate();
return 0;
}

一些函數注釋:

函數glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

//glBufferData函數,它會把之前定義的頂點數據複製到緩衝的內存中
//glBufferData是一個專門用來把用戶定義的數據複製到當前綁定緩衝的函數。
//第一個參數是目標緩衝的類型:頂點緩衝對象當前綁定到GL_ARRAY_BUFFER目標上。
//第二個參數指定傳輸數據的大小(以字節為單位);用一個簡單的sizeof計算出頂點數據大小就行。
//第三個參數是我們希望發送的實際數據。
//第四個參數指定了我們希望顯卡如何管理給定的數據。它有三種形式:
//GL_STATIC_DRAW :數據不會或幾乎不會改變。
//GL_DYNAMIC_DRAW:數據會被改變很多。
//GL_STREAM_DRAW :數據每次繪製時都會改變
//三角形的位置數據不會改變,每次渲染調用時都保持原樣,所以它的使用類型最好是GL_STATIC_DRAW。如果,比如說一個緩衝中的數據將頻繁被改變,那麼使用的類型就是GL_DYNAMIC_DRAW或GL_STREAM_DRAW,這樣就能確保顯卡把數據放在能夠高速寫入的內存部分
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

函數glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);

//連結頂點屬性手,動指定輸入數據的哪一個部分對應頂點著色器的哪一個頂點屬性。
//解析頂點數據(應用到逐個頂點屬性上)設置頂點屬性指針
//glVertexAttribPointer函數的參數非常多,逐一介紹它們
//第一個參數指定我們要配置的頂點屬性。還記得我們在頂點著色器中使用layout(location = 0)定義了position頂點屬性的位置值(Location)嗎?它可以把頂點屬性的位置值設置為0。因為我們希望把數據傳遞到這一個頂點屬性中,所以這裡我們傳入0。
//第二個參數指定頂點屬性的大小。頂點屬性是一個vec3,它由3個值組成,所以大小是3。
//第三個參數指定數據的類型,這裡是GL_FLOAT(GLSL中vec*都是由浮點數值組成的)。
//下個參數定義我們是否希望數據被標準化(Normalize)。如果我們設置為GL_TRUE,所有數據都會被映射到0(對於有符號型signed數據是 - 1)到1之間。我們把它設置為GL_FALSE。
//第五個參數叫做步長(Stride),它告訴我們在連續的頂點屬性組之間的間隔。由於下個組位置數據在3個float之後,我們把步長設置為3 * sizeof(float)。
//最後一個參數的類型是void*,所以需要我們進行這個奇怪的強制類型轉換。它表示位置數據在緩衝中起始位置的偏移量(Offset)。由於位置數據在數組的開頭,所以這裡是0。
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);

示例

函數glShaderSource(vertexShader, 1, &vertexShaderSource, NULL)

//第一個參數為要編譯的著色器對象。
//第二參數指定了傳遞的源碼字符串數量,這裡只有一個。
//第三個參數是頂點著色器真正的源碼,
//第四個參數我們先設置為NULL。
glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);

函數glDrawArrays(GL_TRIANGLES, 0, 3)

//函數第一個參數是我們打算繪製的OpenGL圖元的類型。
//第二個參數指定了頂點數組的起始索引,我們這裡填0
//最後一個參數指定我們打算繪製多少個頂點,這裡是3
glDrawArrays(GL_TRIANGLES, 0, 3);

函數glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0)

//第一個參數指定了我們繪製的模式
//第二個參數是我們打算繪製頂點的個數
//第三個參數是索引的類型,這裡是GL_UNSIGNED_INT
//最後一個參數裡我們可以指定EBO中的偏移量
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);

線框模式(Wireframe Mode)

要想用線框模式繪製你的三角形,你可以通過

glPolygonMode(GL_FRONT_AND_BACK, GL_LINE)函數配置OpenGL如何繪製圖元。

第一個參數表示我們打算將其應用到所有的三角形的正面和背面,

第二個參數告訴我們用線來繪製。之後的繪製調用會一直以線框模式繪製三角形,直到我們用glPolygonMode(GL_FRONT_AND_BACK, GL_FILL)將其設置回默認模式。

相關焦點

  • UE4精品課程 | OpenGL學習筆記(十二)學習OpenGL超級寶典(第五版)
    為後續學習資料與版本特性更好的支持,選擇參考<OpenGL超級寶典>來繼續學習OpenGL;效果預覽:代碼參考(書籍第六章LitTexture代碼,代碼中使用的圖片可以在文章末尾源碼參考中下載得到):#include <glew/glew.h>
  • Scratch3.0進階課程02:畫筆工具和幾何圖形的繪製詳解
    ③ 三角形。它是由三條線段組成的一個閉合圖形,因為它有三個角,所以叫做「三角形」。三角形是一個十分牢固的圖形,它的內角和是180°。④ 圓。在平面上,以一個固定點為圓心,以一個固定的長度為半徑,畫出的閉合曲線就叫做「圓」。圓的特點就是圓心到圓上任意一點的距離都相等。
  • OpenGLES2.0(二)實戰之繪製三角形
    選擇繪製三角形作為OpenGL ES 2.0的第一個實例,是因為前文中提到的,點、線、三角形是OpenGL ES世界的圖形基礎。無論多麼複雜的幾何物體,在OpenGL ES的世界裡都可以用三角形拼成。關於Android OpenGL ES 三角形的繪製,在Android官方文檔中有詳細的說明和步驟,本文實例也是依照官方文檔步驟繪製的三角形。
  • 原創 | 學好opengl走遍天下都不怕系列《基礎篇》
    前言最近本來是想認真學習下《opengl es第三版》這本書,無奈內容過於生澀,有點看不下去,偶遇opengl-tutorial.org
  • NDK OpenGL ES渲染系列 之 繪製三角形
    前言新的知識學習都是循序漸進的,從基礎到複雜。
  • OpenGL glfw學習(一)初識,環境,窗口
    1.2.環境結構以筆者學習的GLFW庫為例,GLFW是一個專門針對OpenGL的C語言庫,既然是C語言庫,那我們一定需要有C語言的編譯環境。GLAD庫比較特殊,進入官網後在網頁上設置自己的opengl版本,點擊GENERATE生成特定的GLAD包,再下載就好。 為方便開發,接下來要組裝一個開發目錄。新建opengl文件夾,將GLFW目錄中的include目錄複製到opengl中去。
  • 如何用python來繪製四邊形-python繪製四邊形圖文教程來了
    python的應用有很多,其中還可以用python來繪製四邊形,下面羽憶教程網為您分享如何用python來繪製四邊形的詳細步驟。python繪製四邊形想要用python繪製四邊形,首先需要調用turtle模塊,這個turtle模塊是python內置的一個非常有趣的模塊,安裝python後自帶的,所以只需要簡單的導入就可以了。1、在python中先導入turtle模塊。
  • 三角形邊的關係及四邊形分類的知識梳理與舉例說明
    三角形的三條邊之間有什麼樣的關係呢?首先我們一定要按照課本上要求做第一個內容——擺一擺。動手操作之後,你就知道了能發現哪三根小棒能擺成三角形,哪三根小棒不能擺成三角形。如果此時你的爸爸媽媽在身邊陪著你,那你是屬於幸福的一類人,好好學習,才值得擁有這份幸福。當然你此時可以邀請爸爸媽媽幫忙一起擺,那將是一件快樂的事,也會成為你以後回憶中的美好時光。為什麼都是三根小棒,有的能擺成三角形,有的卻不能?要解決這個問題,需要你把每組的三個數分別兩兩相加,再用它們的和分別與第三邊的長度相比較,看看是兩個邊的和大,還是第三邊大。
  • OpenGL 與 Go 教程(一)Hello, OpenGL
    這篇教程會按照下面列出的幾個階段進行介紹,我們最終的目標是用 OpenGL 在桌面窗口繪製遊戲面板,進而實現康威生命遊戲[8]。完整的原始碼可以在 GitHub github.com/KyleBanks/conways-gol[4] 上獲得,當你有疑惑的時候可以隨時查看原始碼,或者你要按照自己的方式學習也可以參考這個代碼。
  • 如圖,平行四邊形ABCD面積與三角形CDE面積相等,三角形DEC
    題目如圖,平行四邊形ABCD面積與三角形CDE面積相等。三角形DEC的高8釐米,平行四邊形的高為( )釐米。圖1A.4 B.8 C.16 D.不能確定 普通學生思路:由圖可知,三角形和平行四邊形同底
  • 中考數學常考題之三角形與四邊形綜合
    三角形與四邊形綜合題概述:三角形與四邊形是幾何圖形中的基本圖形,在中考數學的考查中怎能讓這兩個大內容缺席。在全國範圍內的中考試題中,對這兩個大內容的考查形式不盡相同,有以選擇題或填空題單獨考查的,有將兩個內容放在一個解答題中綜合考查的,也有一些地方將三角形與四邊形結合圖形變換做為壓軸題目考查的等等。出現次數比較多的是將三角形與四邊形結合在一道中等難度的解答題中進行考查,分值在6分至8分之間,對於中考數學想要達到優秀分數的同學來說,此類問題應作為必得分題目對待。
  • 三角形、四邊形、五邊形……n邊形規律的匯總
    01三角形、四邊形、五邊形……n邊形的內角和規律如下圖一每增加一條邊就是增加一個三角形,我們知道三角形的內角和是180°,所以每增加一條邊就增加了180°。02三角形、四邊形、五邊形……n邊形以一個頂點發出的對角線的條數
  • 【俊銘學習筆記】人教版四年級數學(下冊)-(4)
    今天是「俊銘學習筆記」的第一期,今天要跟大家分享的是俊銘個人所做的「人教版四年級下冊的數學筆記」,讓我們一起來學習吧!第五單元、三角形1.三角形概念:由3條線段首尾相連圍成的封閉圖形叫三角形。:從三角形的一個頂點到它對邊作一條垂線,頂點和垂足之間的距離就是三角形的高,這條對邊就是三角形的底。
  • 此題屬於壓軸題,求證四邊形是正方形,難點是多次證明三角形全等
    今天,數學世界分享一道有關正方形的證明題,涉及圓的知識,正方形的判定,全等三角形的判定和性質,菱形的判定等知識。 一直以來,數學世界都是精心選擇一些數學題分享給大家,目的是希望由此激發學生們對數學這門課程的興趣,並能給廣大學生的學習提供一點幫助!接下來,數學世界就與大家一起來看題目吧!
  • 初中三角形、四邊形的有關計算證明(經典例題),太有用了!
    考點、熱點分析(1)掌握平行四邊形對邊相等、對角相等、對角線互相平分的性質,四邊形是平行四邊形的條件(一組對邊平行且相等,或兩組對邊分別相等,或對角線互相平分的四邊形是平行四邊形).了解中心對稱圖形及其基本性質;(2)掌握矩形、菱形、正方形的有關性質和四邊形是矩形、菱形、正方形的條件;(3)了解等腰梯形同一底上的兩底角相等
  • 解三角形擴展:四邊形中的最值問題
    四邊形中的最值問題其實是三角形中最值問題的延伸,在三角形最值問題中最常用的方法是三角函數的有界性,即用一個有範圍的角度將所要求出的式子表示出來,利用三角函數是有界函數求出最值即可,但是在四邊形中有時候只設一個角度表示出所要求的式子會很複雜,所以此時最常見的做法是設兩個角度,然後找到兩個角度之間的正餘弦轉化關係,最後依舊轉化為只含有一個角度的有界函數即可,但是除了常規的做法之外
  • 平行四邊形的相關模型和解題策略
    (powered by 騰訊微雲)幾何模型體系視頻課程(點此查看)    三角形總結完了就該到四邊形了,我們總結平行四邊形(簡稱平四)(不含特殊平四要說平四其實可以看做是一個任意的三角形旋轉180度而成,所以說在平四中還是會時常出現三角形有關的結論  01:平四的判定
  • 2020年小升初:平行四邊形面積與三角形周長知識點總結與命題方向
    平行四邊形的面積 【知識點歸納】平行四邊形面積=底×高,用字母表示:S=ah.(a表示底,h表示高)【命題方向】例1:一個平行四邊形相鄰兩條邊分別是6釐米、4釐米,量得一條邊上的高為5釐米,這個平行四邊形的面積是(  )平方釐米.
  • 中考數學壓軸題型:相似模型解析12——三角形和四邊形
    「 正相似形在中考中佔有極大的比重,它的考法又是千變萬化,對於學生來說,既是重點,又是難點.今天講解的是關於「三角形與四邊形模型"的一些基本結論,希望對學生的思維有一定的激發作用,給學生處理問題多一些途徑。
  • 《平行四邊形的性質》教案
    情感態度價值觀目標:提升學生探究數學知識的欲望,增強學生學習數學的信心,同時培養學生嚴謹求實的數學思維。教學重點:平行四邊形的性質定理教學難點:用合情推理提出猜想,用演繹推理證明結論的幾何研究思考方式教學方法:探究教學法,類比教學法教學過程:一、溫故導入教師在上課之前引導學生回顧研究三角形的線索和方法,根據前邊學習的思路三角形的定義,三角形的性質,三角形的全等,特殊三角形的研究,類比三角形的研究請學生預測平行四邊形的研究過程和方法