当前位置: 首页 > news >正文

做免费网站教程新网站如何推广

做免费网站教程,新网站如何推广,配资网站开发,郑州房地产网站贝塞尔曲线 1. 本次作业实现的函数及简单描述#xff08;详细代码见后#xff09;2. 与本次作业有关的基础知识整理3. 代码描述#xff08;详细#xff09;4. 完整代码5. 参考文献 #xff08;本篇为作者学习计算机图形学时根据作业所撰写的笔记#xff0c; 如有同课程请… 贝塞尔曲线 1. 本次作业实现的函数及简单描述详细代码见后2. 与本次作业有关的基础知识整理3. 代码描述详细4. 完整代码5. 参考文献 本篇为作者学习计算机图形学时根据作业所撰写的笔记 如有同课程请勿Crtlc/v 1. 本次作业实现的函数及简单描述详细代码见后 这一块主要介绍本次主要实现的几个函数及其功能 1.bezier(const std::vectorcv::Point2f control_points, cv::Mat window) 可以绘制不止四个点的贝塞尔函曲线并且处理了反走样问题 升级版 利用距离比例进行像素点的判别解决贝塞尔曲线的反走样问题 2.recursive_bezier(const std::vectorcv::Point2f control_points, float t) 根据已有的点vector和给定的t值 计算出来给定t值对应到贝塞尔曲线上的坐标点 2. 与本次作业有关的基础知识整理 这一部分主要介绍一些跟贝塞尔曲线有关的前置知识以及贝塞尔曲线的画法 贝塞尔曲线 Bézier curve(贝塞尔曲线) 是应用于二维图形应用程序的数学曲线。 贝塞尔曲线基础定义 只要求一定经过起止点起止点之间的若干控制点用于控制曲线弯曲的方向最终形成一条经过起止点的光滑曲线被称为贝塞尔曲线。 贝塞尔曲线是线性插值的结果 “选出两点之间的一个点” P(t) P0 (P1−P0) (1−t)P0 t**P1, t∈[0,1] tP0P1/P0P1 根据控制点的个数贝塞尔曲线被分为一阶贝塞尔曲线0个控制点、二阶贝塞尔曲线1个控制点、三阶贝塞尔曲线2个控制点等等。本次实验用到的是三阶贝塞尔曲线2个控制点 二阶贝塞尔曲线 三阶贝塞尔曲线本次作业需要实现的曲线 对于贝塞尔曲线最重要的点是数据点和控制点 数据点 指一条路径的起始点和终止点。 控制点控制点决定了一条路径的弯曲轨迹 贝塞尔曲线特点 特点一 曲线通过始点和终点并与特征多边形首末两边相切于始点和终点中间点将曲线拉向自己。 特点二 平面离散点控制曲线的形状改变一个离散点的坐标曲线的形状将随之改变点对曲线具有整体控制性。 特点三 曲线落在特征多边形的凸包之内它比特征多边形更趋于光滑。 特点四 起始点的方向为响应控制点的切线方向 逐段贝塞尔曲线 当控制点太多会影响控制点的效果的时候 我们选择每四个控制点定义一条贝塞尔曲线然后再将他们连接起来 常见应用场景 计算机辅助设计和计算机辅助制造应用CAD/CAMAdobe Illustrator, Photoshop, Inkscape, Gimp等等。还可以应用在一些图形技术中像矢量图形SVG所以说在可视化学习的重要基础知识。 基本绘制方法 德卡斯特里奥算法 引入参数t (范围为 0~1)取b0到b1, b1到b2上t位置上的点b0’,b1’将b0’,b1’ 连接取b0’到b1’上t位置上的点b0’’将所有t∈01 的点都便利一遍相连即可得到贝塞尔曲线若有n个控制点则将上面步骤进行递归操作直到找到最后bn’ 解决反走样问题 程序在进行画线时是以点的形式如果放大有较为明显的不连续因此可以采用反走样来使其平滑过渡; 对于每一个点其必然会包含在一个像素之中可按照比例和着色进行插值以求得一个较为平滑的过渡; 如下图所示该点一定会在下图所示的黄色方框内部而该点离像素点的最远距离为根号2按照该点到其他四个点的距离进行插值 3. 代码描述详细 这一部分主要介绍实现贝塞尔曲线的各个函数的功能以及注意要点 de Casteljau的算法来计算贝塞尔曲线的点步骤如下 计算点的总个数判断点的个数只有一个点直接返回多个点的话进行计算递归计算多个点t值对应的贝塞尔曲线上的点直到计算到最后一个点 cv::Point2f recursive_bezier(const std::vectorcv::Point2f control_points, float t) {// TODO: Implement de Casteljaus algorithmint n control_points.size();if (n 1) return control_points[0];std::vectorcv::Point2f res_control_points;for (int i 0; i n - 1; i) {res_control_points.push_back(cv::Point2f((1 - t) * control_points[i].x t * control_points[i 1].x,(1 - t) * control_points[i].y t * control_points[i 1].y));}return recursive_bezier(res_control_points, t); }基础版贝塞尔 (简单的将所给点画出) 对每个t值循环计算出来对应的点然后进行绘制 void bezier(const std::vectorcv::Point2f control_points, cv::Mat window) {// TODO: Iterate through all t 0 to t 1 with small steps, and call de Casteljaus // recursive Bezier algorithm.for (double t 0.0; t 1.0; t 0.001) // 循环得到点并记录输出{cv::Point2f point recursive_bezier(control_points, t); window.atcv::Vec3b(point.y, point.x)[1] 255;} }升级版贝塞尔可以解决曲线的反走样问题 先找到根据t值计算出来的贝塞尔曲线上的点其周围四个坐标计算该点到周围四个像素点的距离距离越大颜色应该越浅 {max-distance}按照distance/sum(distance)重新给四个点的像素赋值并与原始色素的值进行比较不能超过255.根据计算出来的点和对应的像素值进行重新绘制 void bezier(const std::vectorcv::Point2f control_points, cv::Mat window) {// TODO: Iterate through all t 0 to t 1 with small steps, and call de Casteljaus // recursive Bezier algorithm.for (float t 0.0; t 1.0; t t 0.001){cv::Point2f point recursive_bezier(control_points, t); //接收每一个t所求得的点//找到该点周围的四个点坐标先找到一个右上的顶点然后其他的通过这个点求出cv::Point2f point_1 cv::Point2f(point.x - std::floor(point.x) 0.5 ? std::floor(point.x) : std::ceil(point.x), //右上的点point.y - std::floor(point.y) 0.5 ? std::floor(point.y) : std::ceil(point.y));cv::Point2f point_2 cv::Point2f(point_1.x - 1.0, point_1.y);cv::Point2f point_3 cv::Point2f(point_1.x - 1.0, point_1.y - 1.0);cv::Point2f point_4 cv::Point2f(point_1.x, point_1.y - 1.0);//用vector容器存储刚刚求得的四个像素点坐标;std::vectorcv::Point2f distance_dot{ point_1,point_2,point_3,point_4 };float MaxDistance sqrt(2.0);float SumDistance 0.0f;float pi_distance 0.0f;std::vectorfloat distance_List {};window.atcv::Vec3b(point.y, point.x)[1] 255;//Mat.at存储类型名称(行列)[通道]for (int i 0; i 4; i){cv::Point2f point_coordinate(distance_dot[i].x 0.5, distance_dot[i].y 0.5);//记录像素中心点;// 距离像素点越近的点 实际上和颜色占比应该越小 因此采用 max-实际距离 的方法进行数据预处理pi_distance MaxDistance - sqrt(std::pow(point.x - point_coordinate.x, 2) std::pow(point.y - (point_coordinate.y), 2));distance_List.push_back(pi_distance);SumDistance pi_distance; // 计算一个总的距离值}for (int i 0; i 4; i){float d distance_List[i] / SumDistance; // d是距离比例系数window.atcv::Vec3b(distance_dot[i].y, distance_dot[i].x)[1] std::min(255.f, window.atcv::Vec3b(distance_dot[i].y, distance_dot[i].x)[1] 255.f * d);//不超过255.f要进行最小值比较}} }4. 完整代码 #include chrono #include iostream #include opencv2/opencv.hppstd::vectorcv::Point2f control_points;void mouse_handler(int event, int x, int y, int flags, void *userdata) {if (event cv::EVENT_LBUTTONDOWN) {std::cout Left button of the mouse is clicked - position ( x , y ) \n;control_points.emplace_back(x, y);} }void naive_bezier(const std::vectorcv::Point2f points, cv::Mat window) {auto p_0 points[0];auto p_1 points[1];auto p_2 points[2];auto p_3 points[3];for (double t 0.0; t 1.0; t 0.001) {auto point std::pow(1 - t, 3) * p_0 3 * t * std::pow(1 - t, 2) * p_1 3 * std::pow(t, 2) * (1 - t) * p_2 std::pow(t, 3) * p_3;window.atcv::Vec3b(point.y, point.x)[2] 255;} }cv::Point2f recursive_bezier(const std::vectorcv::Point2f control_points, float t) {// TODO: Implement de Casteljaus algorithmint n control_points.size();if (n 1) return control_points[0];std::vectorcv::Point2f res_control_points;for (int i 0; i n - 1; i) {res_control_points.push_back(cv::Point2f((1 - t) * control_points[i].x t * control_points[i 1].x,(1 - t) * control_points[i].y t * control_points[i 1].y));}return recursive_bezier(res_control_points, t); }void bezier(const std::vectorcv::Point2f control_points, cv::Mat window) {// TODO: Iterate through all t 0 to t 1 with small steps, and call de Casteljaus // recursive Bezier algorithm.for (float t 0.0; t 1.0; t t 0.001){cv::Point2f point recursive_bezier(control_points, t); //接收每一个t所求得的点//找到该点周围的四个点坐标先找到一个右上的顶点然后其他的通过这个点求出cv::Point2f point_1 cv::Point2f(point.x - std::floor(point.x) 0.5 ? std::floor(point.x) : std::ceil(point.x), //右上的点point.y - std::floor(point.y) 0.5 ? std::floor(point.y) : std::ceil(point.y));cv::Point2f point_2 cv::Point2f(point_1.x - 1.0, point_1.y);cv::Point2f point_3 cv::Point2f(point_1.x - 1.0, point_1.y - 1.0);cv::Point2f point_4 cv::Point2f(point_1.x, point_1.y - 1.0);//用vector容器存储刚刚求得的四个像素点坐标;std::vectorcv::Point2f distance_dot{ point_1,point_2,point_3,point_4 };float MaxDistance sqrt(2.0);float SumDistance 0.0f;float pi_distance 0.0f;std::vectorfloat distance_List {};window.atcv::Vec3b(point.y, point.x)[1] 255;//Mat.at存储类型名称(行列)[通道]for (int i 0; i 4; i){cv::Point2f point_coordinate(distance_dot[i].x 0.5, distance_dot[i].y 0.5);//记录像素中心点;// 距离像素点越近的点 实际上和颜色占比应该越小 因此采用 max-实际距离 的方法进行数据预处理pi_distance MaxDistance - sqrt(std::pow(point.x - point_coordinate.x, 2) std::pow(point.y - (point_coordinate.y), 2));distance_List.push_back(pi_distance);SumDistance pi_distance; // 计算一个总的距离值}for (int i 0; i 4; i){float d distance_List[i] / SumDistance; // d是距离比例系数window.atcv::Vec3b(distance_dot[i].y, distance_dot[i].x)[1] std::min(255.f, window.atcv::Vec3b(distance_dot[i].y, distance_dot[i].x)[1] 255.f * d);//不超过255.f要进行最小值比较}}}int main() {cv::Mat window cv::Mat(700, 700, CV_8UC3, cv::Scalar(0));cv::cvtColor(window, window, cv::COLOR_BGR2RGB);cv::namedWindow(Bezier Curve, cv::WINDOW_AUTOSIZE);cv::setMouseCallback(Bezier Curve, mouse_handler, nullptr);int key -1;while (key ! 27) {window.setTo(0);for (auto point : control_points) {cv::circle(window, point, 3, {255, 255, 255}, 3);}if (control_points.size() 4) {naive_bezier(control_points, window); // 所有点的绘制的贝塞尔曲线用绿色表示bezier(control_points, window); // 前四个点绘制的贝塞尔曲线用红色显示cv::imshow(Bezier Curve, window);cv::imwrite(my_bezier_curve.png, window);key cv::waitKey(1);}cv::imshow(Bezier Curve, window);key cv::waitKey(20);}return 0; } 5. 参考文献 1. 贝塞尔曲线 2. opencv 处理鼠标事件的方法 3. 贝塞尔曲线简单介绍 4. 解决反走样问题
http://www.yutouwan.com/news/185246/

相关文章:

  • 广西网站建设服务哈尔滨优化关键词免费
  • 网站打不开dns修改网上招聘网站开发报告
  • php上传到fpt后网站前台空白有时连的上后台正常福州网站建设费用
  • 网站设计活动主题wordpress主题颜色切换插件
  • 网站建设流程书籍flash网站设计实例
  • 重庆铜梁网站建设价格两学一做纪实评价系统登陆网站
  • 肥西县重点建设局网站最新军事新闻事件报道
  • 工程技术研究中心网站建设要求怎么建设自己的一个服务器网站
  • 网站推广及建设ppt品牌建设报告
  • 定制型网站设计价格网站建设与维护招聘条件
  • 牙克石网站建设阳江招聘网最新消息
  • 网建网站沈阳男科医院收费标准
  • 钓鱼网站下载安装wordpress 积分可见
  • 购物网站开发案例教程公司网站怎么设计
  • 电子商务网站建设与维护实验报告c 做网站方便吗
  • 一级a做爰电影片免费网站南昌正规网站公司吗
  • 上传网站源码国家企业公示信息查询系统官网
  • 网站开发补充合同动态域名网站
  • 网站建设的图片北京网站定制建设
  • 网页制作公司网站wordpress外部样式
  • 做留言的网站河南网站建设制作价格
  • 新华区网站建设删除wordpress首页链接
  • 鞍山建设网站公司品牌vi设计升级
  • php商城网站建设多少钱北京网络营销招聘
  • 网站百度不到验证码怎么办啊做网站有什么不好
  • php网站开发外包太仓网站建设有限公司
  • 网站建设的意义与目的如何在人力资源网站做合同续签
  • wordpress怎么加入站长统计代码实时网站制作
  • 更换wordpress后台登陆地址360优化大师下载
  • 广告投放跟网站建设一样吗网站建设需求分析文档