GAMES101-Homework2

目錄

  • 普通作業:
  • 提高作業:
  • 參考博客
    • 博客一
    • 博客二
    • 博客三
  • 附代碼框架的個人一些注釋和理解:
    • rasterizer.cpp
    • Triangle.cpp

普通作業:

// 判斷點是否在三角形內的輔助函數
static bool insideTriangle(float x, float y, const Vector3f* _v)
{//Vector3f* _v這個參數是一個Vector3f指針,實際上代表的是一個數組。數組中的每個元素是一個Vector3f類型,//也就是代表了一個頂點的坐標。每個點用_v[0],_v[1],_v[2]表示。而每個_v[0]就是一個Vector3f類型的點。// //整個數組代表了多個點。這里一般認為傳入的是三個點,即一個三角形。const Eigen::Vector2f P(x, y);// 提取x和yconst Eigen::Vector2f A = _v[0].head(2), B = _v[1].head(2), C = _v[2].head(2);// 計算需求的向量const Eigen::Vector2f AP = P - A;const Eigen::Vector2f BP = P - B;const Eigen::Vector2f CP = P - C;const Eigen::Vector2f AB = B - A;const Eigen::Vector2f BC = C - B;const Eigen::Vector2f CA = A - C;//計算叉積float eq1 = AB[0] * AP[1] - AB[1] * AP[0];float eq2 = BC[0] * BP[1] - BC[1] * BP[0];float eq3 = CA[0] * CP[1] - CA[1] * CP[0];//判斷是否同向if (eq1 > 0 && eq2 > 0 && eq3 > 0)return true;else if (eq1 < 0 && eq2 < 0 && eq3 < 0)return true;elsereturn false;// TODO: 實現此函數,檢查點 (x, y) 是否在由 _v[0]、_v[1]、_v[2] 表示的三角形內
}
// 屏幕空間光柵化
void rst::rasterizer::rasterize_triangle(const Triangle& t)
{auto v = t.toVector4();int min_x = INT_MAX;int max_x = INT_MIN;int min_y = INT_MAX;int max_y = INT_MIN;//找出包圍盒的邊界for (auto point : v){if (point[0] < min_x) min_x = point[0];if (point[0] > max_x) max_x = point[0];if (point[1] < min_y) min_y = point[1];if (point[1] > max_y) max_y = point[1];}for (int y = min_y; y <= max_y; y++){for (int x = min_x; x <= max_x; x++){if (insideTriangle((float)x + 0.5, (float)y + 0.5, t.v)){// 如果是這樣,使用以下代碼獲取插值的 z 值。// auto [alpha, beta, gamma] = computeBarycentric2D(x, y, t.v);   C++17以上的版本才可以用此句,否則修改成下面的倆句float alpha, beta, gamma;std::tie(alpha, beta, gamma) = computeBarycentric2D(x, y, t.v);float w_reciprocal = 1.0 / (alpha / v[0].w() + beta / v[1].w() + gamma / v[2].w());float z_interpolated = alpha * v[0].z() / v[0].w() + beta * v[1].z() / v[1].w() + gamma * v[2].z() / v[2].w();z_interpolated *= w_reciprocal;if (z_interpolated < depth_buf[get_index(x, y)]){Eigen::Vector3f p = { (float)x,(float)y, z_interpolated }; //當前坐標set_pixel(p, t.getColor());depth_buf[get_index(x, y)] = z_interpolated; //更新z值}}}}// TODO: 找出當前三角形的邊界框。// 遍歷像素并查找當前像素是否在三角形內// 如果是這樣,使用以下代碼獲取插值的 z 值。// auto[alpha, beta, gamma] = computeBarycentric2D(x, y, t.v);// float w_reciprocal = 1.0/(alpha / v[0].w() + beta / v[1].w() + gamma / v[2].w());// float z_interpolated = alpha * v[0].z() / v[0].w() + beta * v[1].z() / v[1].w() + gamma * v[2].z() / v[2].w();// z_interpolated *= w_reciprocal;// TODO: 設置當前像素(使用 set_pixel 函數)為三角形的顏色(使用 getColor 函數),如果應該繪制的話。
}

提高作業:

MSAA多重采樣抗鋸齒
這個算法很簡單,只要把判斷像素中心點在不在三角形內改成判斷像素塊中的四個采樣點在不在三角形內,然后按點在三角形內的比例去改變顏色就行,話不多說看代碼更清楚:

void rst::rasterizer::rasterize_triangle(const Triangle& t) {auto v = t.toVector4();int min_x = INT_MAX;int max_x = INT_MIN;int min_y = INT_MAX;int max_y = INT_MIN;for (auto point : v){if (point[0] < min_x) min_x = point[0];if (point[0] > max_x) max_x = point[0];if (point[1] < min_y) min_y = point[1];if (point[1] > max_y) max_y = point[1];}//MSAA:for (int y = min_y; y <= max_y; y++){for (int x = min_x; x <= max_x; x++){float fineness = 0; //創建一個純度值if (insideTriangle((float)x + 0.25, (float)y + 0.25, t.v)) fineness += 0.25; //改為判斷四個采樣塊的中心點在不在三角形內if (insideTriangle((float)x + 0.25, (float)y + 0.75, t.v)) fineness += 0.25;if (insideTriangle((float)x + 0.75, (float)y + 0.25, t.v)) fineness += 0.25;if (insideTriangle((float)x + 0.75, (float)y + 0.75, t.v)) fineness += 0.25;if (fineness != 0) {auto abg = computeBarycentric2D((float)x + 0.5, (float)y + 0.5, t.v);float alpha = std::get<0>(abg);float beta = std::get<1>(abg);float gamma = std::get<2>(abg);float w_reciprocal = 1.0 / (alpha / v[0].w() + beta / v[1].w() + gamma / v[2].w());float z_interpolated = alpha * v[0].z() / v[0].w() + beta * v[1].z() / v[1].w() + gamma * v[2].z() / v[2].w();z_interpolated *= w_reciprocal;if (z_interpolated < depth_buf[get_index(x, y)]){Eigen::Vector3f p = { (float)x,(float)y, z_interpolated };set_pixel(p, fineness*t.getColor()); //將比例乘給顏色depth_buf[get_index(x, y)] = z_interpolated;}}}}
}

參考博客

博客一

博客二

博客三

附代碼框架的個人一些注釋和理解:

rasterizer.cpp

// 防止代碼格式化
//
// 由 goksu 于 4/6/19 創建#include <algorithm>
#include <vector>
#include "rasterizer.h"
#include <opencv2/opencv.hpp>
#include <math.h>// 將三維向量加載到頂點緩沖區的函數
rst::pos_buf_id rst::rasterizer::load_positions(const std::vector<Eigen::Vector3f>& positions)
{auto id = get_next_id();pos_buf.emplace(id, positions);return { id };
}// 將三維向量加載到索引緩沖區的函數
rst::ind_buf_id rst::rasterizer::load_indices(const std::vector<Eigen::Vector3i>& indices)
{auto id = get_next_id();ind_buf.emplace(id, indices);return { id };
}// 將三維向量加載到顏色緩沖區的函數
rst::col_buf_id rst::rasterizer::load_colors(const std::vector<Eigen::Vector3f>& cols)
{auto id = get_next_id();col_buf.emplace(id, cols);return { id };
}// 將三維向量轉換為四維向量的輔助函數
auto to_vec4(const Eigen::Vector3f& v3, float w = 1.0f)
{return Vector4f(v3.x(), v3.y(), v3.z(), w);
}
//------------------補充——————————————————————————
// 判斷點是否在三角形內的輔助函數
static bool insideTriangle(float x, float y, const Vector3f* _v)
{//Vector3f* _v這個參數是一個Vector3f指針,實際上代表的是一個數組。數組中的每個元素是一個Vector3f類型,//也就是代表了一個頂點的坐標。每個點用_v[0],_v[1],_v[2]表示。而每個_v[0]就是一個Vector3f類型的點。// //整個數組代表了多個點。這里一般認為傳入的是三個點,即一個三角形。const Eigen::Vector2f P(x, y);// 提取x和yconst Eigen::Vector2f A = _v[0].head(2), B = _v[1].head(2), C = _v[2].head(2);// 計算需求的向量const Eigen::Vector2f AP = P - A;const Eigen::Vector2f BP = P - B;const Eigen::Vector2f CP = P - C;const Eigen::Vector2f AB = B - A;const Eigen::Vector2f BC = C - B;const Eigen::Vector2f CA = A - C;//計算叉積float eq1 = AB[0] * AP[1] - AB[1] * AP[0];float eq2 = BC[0] * BP[1] - BC[1] * BP[0];float eq3 = CA[0] * CP[1] - CA[1] * CP[0];//判斷是否同向if (eq1 > 0 && eq2 > 0 && eq3 > 0)return true;else if (eq1 < 0 && eq2 < 0 && eq3 < 0)return true;elsereturn false;// TODO: 實現此函數,檢查點 (x, y) 是否在由 _v[0]、_v[1]、_v[2] 表示的三角形內
}// 計算二維重心坐標的輔助函數
static std::tuple<float, float, float> computeBarycentric2D(float x, float y, const Vector3f* v)
{// 計算重心坐標float c1 = (x * (v[1].y() - v[2].y()) + (v[2].x() - v[1].x()) * y + v[1].x() * v[2].y() - v[2].x() * v[1].y()) /(v[0].x() * (v[1].y() - v[2].y()) + (v[2].x() - v[1].x()) * v[0].y() + v[1].x() * v[2].y() - v[2].x() * v[1].y());float c2 = (x * (v[2].y() - v[0].y()) + (v[0].x() - v[2].x()) * y + v[2].x() * v[0].y() - v[0].x() * v[2].y()) /(v[1].x() * (v[2].y() - v[0].y()) + (v[0].x() - v[2].x()) * v[1].y() + v[2].x() * v[0].y() - v[0].x() * v[2].y());float c3 = (x * (v[0].y() - v[1].y()) + (v[1].x() - v[0].x()) * y + v[0].x() * v[1].y() - v[1].x() * v[0].y()) /(v[2].x() * (v[0].y() - v[1].y()) + (v[1].x() - v[0].x()) * v[2].y() + v[0].x() * v[1].y() - v[1].x() * v[0].y());return { c1, c2, c3 };
}// 繪制函數,根據指定類型繪制三角形
void rst::rasterizer::draw(pos_buf_id pos_buffer, ind_buf_id ind_buffer, col_buf_id col_buffer, Primitive type)
{auto& buf = pos_buf[pos_buffer.pos_id];auto& ind = ind_buf[ind_buffer.ind_id];auto& col = col_buf[col_buffer.col_id];// 計算透視變換的范圍float f1 = (50 - 0.1) / 2.0;float f2 = (50 + 0.1) / 2.0;Eigen::Matrix4f mvp = projection * view * model;for (auto& i : ind){Triangle t;Eigen::Vector4f v[] = {mvp * to_vec4(buf[i[0]], 1.0f),mvp * to_vec4(buf[i[1]], 1.0f),mvp * to_vec4(buf[i[2]], 1.0f)};// 齊次除法for (auto& vec : v){vec /= vec.w();}// 視口變換for (auto& vert : v){vert.x() = 0.5 * width * (vert.x() + 1.0);vert.y() = 0.5 * height * (vert.y() + 1.0);vert.z() = vert.z() * f1 + f2;}for (int i = 0; i < 3; ++i){t.setVertex(i, v[i].head<3>());t.setVertex(i, v[i].head<3>());t.setVertex(i, v[i].head<3>());}auto col_x = col[i[0]];auto col_y = col[i[1]];auto col_z = col[i[2]];t.setColor(0, col_x[0], col_x[1], col_x[2]);t.setColor(1, col_y[0], col_y[1], col_y[2]);t.setColor(2, col_z[0], col_z[1], col_z[2]);rasterize_triangle(t);}
}//------------------補充——————————————————————————
// 屏幕空間光柵化
void rst::rasterizer::rasterize_triangle(const Triangle& t)
{auto v = t.toVector4();int min_x = INT_MAX;int max_x = INT_MIN;int min_y = INT_MAX;int max_y = INT_MIN;//找出包圍盒的邊界for (auto point : v){if (point[0] < min_x) min_x = point[0];if (point[0] > max_x) max_x = point[0];if (point[1] < min_y) min_y = point[1];if (point[1] > max_y) max_y = point[1];}for (int y = min_y; y <= max_y; y++){for (int x = min_x; x <= max_x; x++){if (insideTriangle((float)x + 0.5, (float)y + 0.5, t.v)){// 如果是這樣,使用以下代碼獲取插值的 z 值。// auto [alpha, beta, gamma] = computeBarycentric2D(x, y, t.v);   C++17以上的版本才可以用此句,否則修改成下面的倆句float alpha, beta, gamma;std::tie(alpha, beta, gamma) = computeBarycentric2D(x, y, t.v);float w_reciprocal = 1.0 / (alpha / v[0].w() + beta / v[1].w() + gamma / v[2].w());float z_interpolated = alpha * v[0].z() / v[0].w() + beta * v[1].z() / v[1].w() + gamma * v[2].z() / v[2].w();z_interpolated *= w_reciprocal;if (z_interpolated < depth_buf[get_index(x, y)]){Eigen::Vector3f p = { (float)x,(float)y, z_interpolated }; //當前坐標set_pixel(p, t.getColor());depth_buf[get_index(x, y)] = z_interpolated; //更新z值}}}}// TODO: 找出當前三角形的邊界框。// 遍歷像素并查找當前像素是否在三角形內// 如果是這樣,使用以下代碼獲取插值的 z 值。// auto[alpha, beta, gamma] = computeBarycentric2D(x, y, t.v);// float w_reciprocal = 1.0/(alpha / v[0].w() + beta / v[1].w() + gamma / v[2].w());// float z_interpolated = alpha * v[0].z() / v[0].w() + beta * v[1].z() / v[1].w() + gamma * v[2].z() / v[2].w();// z_interpolated *= w_reciprocal;// TODO: 設置當前像素(使用 set_pixel 函數)為三角形的顏色(使用 getColor 函數),如果應該繪制的話。
}// 設置模型矩陣的函數
void rst::rasterizer::set_model(const Eigen::Matrix4f& m)
{model = m;
}// 設置視圖矩陣的函數
void rst::rasterizer::set_view(const Eigen::Matrix4f& v)
{view = v;
}// 設置投影矩陣的函數
void rst::rasterizer::set_projection(const Eigen::Matrix4f& p)
{projection = p;
}// 清除顏色和深度緩沖區的函數
void rst::rasterizer::clear(rst::Buffers buff)
{if ((buff & rst::Buffers::Color) == rst::Buffers::Color){std::fill(frame_buf.begin(), frame_buf.end(), Eigen::Vector3f{ 0, 0, 0 });}if ((buff & rst::Buffers::Depth) == rst::Buffers::Depth){std::fill(depth_buf.begin(), depth_buf.end(), std::numeric_limits<float>::infinity());}
}// 構造函數,初始化寬度和高度
rst::rasterizer::rasterizer(int w, int h) : width(w), height(h)
{frame_buf.resize(w * h);depth_buf.resize(w * h);
}// 獲取索引的函數
int rst::rasterizer::get_index(int x, int y)
{return (height - 1 - y) * width + x;
}// 設置像素顏色的函數
void rst::rasterizer::set_pixel(const Eigen::Vector3f& point, const Eigen::Vector3f& color)
{// 舊的索引:auto ind = point.y() + point.x() * width;auto ind = (height - 1 - point.y()) * width + point.x();frame_buf[ind] = color;
}

Triangle.cpp

//
// Created by LEI XU on 4/11/19.
//#include "Triangle.h"
#include <algorithm>
#include <array>// 初始化三角形的頂點坐標、顏色和紋理坐標為零向量或零值
Triangle::Triangle() {v[0] << 0, 0, 0;v[1] << 0, 0, 0;v[2] << 0, 0, 0;color[0] << 0.0, 0.0, 0.0;color[1] << 0.0, 0.0, 0.0;color[2] << 0.0, 0.0, 0.0;tex_coords[0] << 0.0, 0.0;tex_coords[1] << 0.0, 0.0;tex_coords[2] << 0.0, 0.0;
}
// 設置三角形的頂點坐標
void Triangle::setVertex(int ind, Vector3f ver) {v[ind] = ver;
}
// 設置三角形的法向量
void Triangle::setNormal(int ind, Vector3f n) {normal[ind] = n;
}
// 設置三角形的顏色
void Triangle::setColor(int ind, float r, float g, float b) {if ((r < 0.0) || (r > 255.) ||(g < 0.0) || (g > 255.) ||(b < 0.0) || (b > 255.)) {fprintf(stderr, "ERROR! Invalid color values");fflush(stderr);exit(-1);}// 將顏色值存儲為范圍在[0, 1]之間的Vector3fcolor[ind] = Vector3f((float)r / 255., (float)g / 255., (float)b / 255.);return;
}
// 設置三角形的紋理坐標
void Triangle::setTexCoord(int ind, float s, float t) {tex_coords[ind] = Vector2f(s, t);
}
// 將三角形的頂點坐標轉換為四維向量
//這里transform()是stl算法,作用是將第一個迭代器的元素做op變換之后放到第二個迭代器中,
//最后一個位置的參數代表重載() {}運算符的操作。這里的transform的意思就是將v中vec的xyz存給res
std::array<Vector4f, 3> Triangle::toVector4() const
{std::array<Eigen::Vector4f, 3> res;std::transform(std::begin(v), std::end(v), res.begin(), [](auto& vec) { return Eigen::Vector4f(vec.x(), vec.y(), vec.z(), 1.f); });return res;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/164406.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/164406.shtml
英文地址,請注明出處:http://en.pswp.cn/news/164406.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

再添千萬級罰單,某銀行年內罰款過億!金融行業合規問題亟待解決

11月17日晚間&#xff0c;國家金融監管總局上海監管局披露行政處罰信息顯示&#xff0c;某銀行因32項違法違規事實收到兩張690萬元的大額罰單&#xff0c;合計罰款金額達1380萬元。但這并不是銀行該今年收到的第一張大額罰單。今年4月28日&#xff0c;該行因在結售匯、外幣理財…

k8s-pod生命周期 4

容器環境初始化 pod 由pod 鏡像來提供&#xff0c;在pod 生命周期里容器主要分為兩種&#xff1a;初始化容器和主容器 初始化容器一定要成功運行并退出&#xff0c;當初始化容器運行退出完了之后主容器開始和運行 主容器開始運行的時候&#xff0c;有兩個探針&#xff1a;存…

什么是arguments對象?

arguments 對象是 JavaScript 中的一個特殊對象&#xff0c;它包含了函數被調用時傳入的所有參數。arguments 對象是一個類數組對象&#xff0c;它有一個 length 屬性和按數字索引的元素。 每個函數在執行時都會自動創建一個 arguments 對象。我們可以通過arguments去訪問參數…

網絡圖簡單計算規則

單代號進度網絡圖&#xff08;節點法&#xff09; 概念 計算規則 &#xff08;順時針計算法&#xff09; &#xff08;TF取之差&#xff09; &#xff08;T&#xff1a;持續時間&#xff09; ES → EF (ES取大EF加T) ↑ T ↑ &#xff08;TF&#xff1a;總時差&…

NOIP2003提高組第二輪T3:加分二叉樹

題目鏈接 [NOIP2003 提高組] 加分二叉樹 題目描述 設一個 n n n 個節點的二叉樹 tree \text{tree} tree 的中序遍歷為 ( 1 , 2 , 3 , … , n ) (1,2,3,\ldots,n) (1,2,3,…,n)&#xff0c;其中數字 1 , 2 , 3 , … , n 1,2,3,\ldots,n 1,2,3,…,n 為節點編號。每個節點都…

【視覺SLAM十四講學習筆記】第三講——Eigen庫

專欄系列文章如下&#xff1a; 【視覺SLAM十四講學習筆記】第一講——SLAM介紹 【視覺SLAM十四講學習筆記】第二講——初識SLAM 【視覺SLAM十四講學習筆記】第三講——旋轉矩陣 本章將介紹視覺SLAM的基本問題之一&#xff1a;如何描述剛體在三維空間中的運動&#xff1f; Eigen…

網工內推 | Base北京,國企網工運維,最高30k*14薪,IE認證優先

01 萬方數據股份有限公司 招聘崗位&#xff1a;網絡工程師 職責描述&#xff1a; 1.負責完成基礎網絡組網工作&#xff1b; 2.負責網絡對象的訪問控制及安全策略&#xff0c;配置VLan&#xff0c;黑白名單、地址轉換、故障排查及網絡安全監控工作&#xff1b; 3.負責對操作系…

Vue框架學習筆記——Vue實例中el和data的兩種寫法

文章目錄 前文提要Vue實例的el第一種寫法第二種寫法小結 Vue實例中data第一種寫法&#xff0c;對象式效果圖片第二種寫法&#xff0c;函數式效果圖片小結 前文提要 本文僅做自己的學習記錄&#xff0c;如有錯誤&#xff0c;請多諒解 Vue實例的el 第一種寫法 <body><…

Python圖片文件和base64編碼互轉

圖片和base64編碼互轉 import base64 import cv2# 將圖片base64字符串生成圖片文件. def base64_to_img(base64_code,save_img_path):"""根據base64生成圖片.:param base64_code: 圖片的base64文件:param save_img_path: 生成的圖片路徑:returns: None"&q…

分布式鎖之基于mysql實現分布式鎖(四)

不管是jvm鎖還是mysql鎖&#xff0c;為了保證線程的并發安全&#xff0c;都提供了悲觀獨占排他鎖。所以獨占排他也是分布式鎖的基本要求。 可以利用唯一鍵索引不能重復插入的特點實現。設計表如下&#xff1a; CREATE TABLE tb_lock (id bigint(20) NOT NULL AUTO_INCREMENT,…

(二)C語言之變量與算數運算表達式概述

C語言之變量與算數運算表達式概述 一、華氏溫度與攝氏溫度對照二、代碼概述三、練習 一、華氏溫度與攝氏溫度對照 #include <stdio.h>/*當華氏溫度為 0,20,40,...300時&#xff0c;打印出華氏溫度與攝氏溫度對照表華氏溫度與攝氏溫度 C(5/9)(?F-32) 其中C表示攝氏溫度&…

順序棧和鏈棧

#include<iostream> using namespace std; #define MAXSIZE 100 typedef int SElemType; typedef struct { SElemType* base; SElemType* top; int stacksize; }SqStack;//順序棧 //構造一個空棧 int InitStack(SqStack& s) { s.base new SElemType…

Django之中間件與CSRF_TOKEN

文章目錄 一、什么是中間件二、中間件有什么用三、Django自定義中間件中間件中主要方法及作用創建自定義中間件的步驟&#xff1a;process_request與process_response方法process_view方法process_exceptionprocess_template_response&#xff08;不常用&#xff09; 四、CSRF_…

mysql latin-1報錯解決

conn pymysql.connect(hostmeta_conf[host], usermeta_conf[user], passwordmeta_conf[password], portmeta_conf[port], charsetutf8) 光把表聲明 ENGINEINNODB DEFAULT CHARSETutf8mb4 COLLATEutf8mb4_bin ROW_FORMATDYNAMIC 并不能解決這個報錯,需要在創建mysql連接時候…

面試:RabbitMQ相關問題

文章目錄 簡單介紹RabbitMQRabbitMQ架構什么是 RabbitMQ&#xff1f;有什么顯著的特點&#xff1f;RabbitMQ 有那些基本概念&#xff1f;RabbitMQ routing 路由模式消息怎么路由&#xff1f;RabbitMQ publish/subscribe 發布訂閱(共享資源)能夠在地理上分開的不同數據中心使用 …

vue2指令的使用和自定義指令

前言 個人認為vue的指令,對比react來說,給開發者節省了很大的學習成本。比如在react中,你想渲染一個列表,需要用Array.map的方法return<div>,而在vue中,一個簡單的v-for就解決了問題。 在學習成本和入手體驗上,vue的作者確實后來者居上,能讓人更快的使用vue開發。不過也…

無邊界電視點播TVbox殼+源

TBBox可以是個盒子也可以是軟件 視頻播放的困局新的改變TVBox apk更成熟的熊貓寶盒_3.10還有這個沒測試恒星TV 寫在最后 視頻播放的困局 現在電視上幾大平臺看劇集都要充會員&#xff0c;而電腦上網頁端有很多可以看的網頁&#xff0c;只有 隨便一搜就測出來&#xff0c;只是經…

數據安全第一:應對[[MyFile@waifu.club]].wis勒索病毒的實用建議與技巧

引言&#xff1a; 在當今數字化時代&#xff0c;[[MyFilewaifu.club]].wis、[[backupwaifu.club]].wis勒索病毒是一種惡意軟件&#xff0c;其危害用戶數據安全&#xff0c;通過加密文件并勒索贖金來獲取經濟利益。以下是對[[MyFilewaifu.club]].wis、[[backupwaifu.club]].wis…

PyTorch包

進入PyTorch的官網&#xff1a; pytorch GitHub 點擊GitHub&#xff1a; 進入PyTorch的主目錄&#xff1a; 進入Vision reference&#xff1a; detection&#xff1a; 這就是我們在訓練過程中會使用到的文件了&#xff1a;

objdump反匯編文件解析

命令使用 objdump可以對可執行文件進行反匯編 其常用參數為: objdump -d <file(s)>: 將代碼段反匯編&#xff1b;objdump -S <file(s)>: 將代碼段反匯編的同時&#xff0c;將反匯編代碼與源代碼交替顯示&#xff0c;編譯時需要使用-g參數&#xff0c;即需要調試信…