【计算机图形学】扫描转换算法(Bresenham1/4圆法 椭圆两头逼近法 方形刷子)

news2025/6/20 12:42:18

一 实验目的

  1. 编写弧线的光栅扫描转换算法,并对线宽与线形的算法加以探讨
  2. 熟悉圆和椭圆画线的算法

二 实验算法理论分析
Bresenham法(1/4圆)


椭圆扫描转换——两头逼近法:


处理线宽问题:

 方形刷子宽度存在的问题:

1:线段的始末端点总是水平或垂直的。

2:水平或垂直方形刷子与线条垂直,其粗细与线宽相等,而对于45°斜线,粗细为指定线宽的1.4倍。

3:重复写象素。为每条扫描线建一个活化边表,存放该扫描线与线条的相交区间左右端点位置。

三 实验内容

4:用四分法画半径为r的一个完整的圆,用鼠标选择圆心位置。

实验结果如下图所示:
第一步:输入所画圆的半径和勾勒的颜色(此处以50像素为圆的半径,白色为勾勒的颜色为例)。


第二步:通过鼠标左键点击画布,编译后的文件自动以当前的鼠标坐标为圆心,画出目标半径和颜色的圆形图案。

5:画一个半长轴为a和半短轴为b的完整椭圆,用鼠标选择圆心位置。

实验结果如下图所示:
第一步:输入所画椭圆的半长轴、半短轴和勾勒的颜色(此处以200像素和100像素为椭圆的半长轴和半短轴,白色为勾勒的颜色为例)。


第二步:通过鼠标左键点击画布,编译后的文件自动以当前的鼠标坐标为圆心,画出目标半长轴、半短轴和颜色的椭圆形图案。

6:设计具有宽度的画线算法,并处理线条连接处出现缺口的问题。

实验结果如下图所示:
第一步:编写代码查看未处理缺口的图像,以便后续进行对比。【此处以第一条直线起点(0,0)、终点(100,100),第二条直线起点(100,100)、终点(400,300)为例】


放大后可观察到连接处有一定程度的缺口。

 

第二步:通过改进bresenham画线算法,弥补缺口。

方法一:通过硬修改直线端点处的宽度绘画法连接两条直线。【此处以第一条直线起点(0,0)、终点(100,100),第二条直线起点(100,100)、终点(400,300)为例】
输入坐标数据内容:


程序生成图像:


放大后可观察到连接处较平稳:但是缺点明显,比如斜率绝对值过度小于1的直线宽度从视觉上来说不够。

 

方法二:通过改进bresenham算法,将putpixel()函数改进为minepixel()函数,通过方形刷子的方法进行缺口填缺。【此处以第一条直线起点(100,100)、终点(200,100),第二条直线起点(200,100)、终点(400,400)为例】
输入坐标数据内容:

程序生成图像:


放大后可观察到连接处较平稳:

 

 

四 程序说明

Project中程序的调用:

将当前cpp文件的属性——常规——从生成中排除中选择否,其他文件选择是,即可运行当前的cpp文件

4

//

// 程序名称:画圆算法

// 功  能:用四分法画半径为r的一个完整的圆,用鼠标选择圆心位置

// 编译环境:VS2019,EasyX_20220116

// 最后修改:2022-3-10

#include <graphics.h>

#include <conio.h>

#include <iostream>

using namespace std;

void Circle(int myx, int myy, int r, int color) {

    int x, y, delta, delta1, delta2, direction;

    //画第一象限的圆弧

    x = 0;

    y = r;

    delta = 2 * (1 - r);

    while(y >= 0) {

       putpixel(myx + x, myy + y, color);

       if (delta < 0) {

           delta1 = 2 * (delta + y) - 1;

           if (delta1 <= 0) {

              direction = 1;

           }

           else {

              direction = 2;

           }

       }

       else if (delta > 0) {

           delta2 = 2 * (delta - x) - 1;

           if (delta2 <= 0) {

              direction = 2;

           }

           else {

              direction = 3;

           }

       }

       else {

           direction = 2;

       }

       switch (direction) {

       case 1:

           x++;

           delta += 2 * x + 1;

           break;

       case 2:

           x++;

           y--;

           delta += 2 * (x - y + 1);

           break;

       case 3:

           y--;

           delta += (-2 * y + 1);

           break;

       }

    }

    //画第二象限的圆弧

    x = 0;

    y = r;

    delta = 2 * (1 - r);

    while (y >= 0) {

       putpixel(myx + x, myy + y, color);

       if (delta < 0) {

           delta1 = 2 * (delta + y) - 1;

           if (delta1 <= 0) {

              direction = 1;

           }

           else {

              direction = 2;

           }

       }

       else if (delta > 0) {

           delta2 = 2 * (delta - x) - 1;

           if (delta2 <= 0) {

              direction = 2;

           }

           else {

              direction = 3;

           }

       }

       else {

           direction = 2;

       }

       switch (direction) {

       case 1:

           x--;

           delta += 2 * (-x) + 1;

           break;

       case 2:

           x--;

           y--;

           delta += 2 * (-x - y + 1);

           break;

       case 3:

           y--;

           delta += (-2 * y + 1);

           break;

       }

    }

    //画第三象限的圆弧

    x = 0;

    y = -r;

    delta = 2 * (1 - r);

    while (y <= 0) {

       putpixel(myx + x, myy + y, color);

       if (delta < 0) {

           delta1 = 2 * (delta - y) - 1;

           if (delta1 <= 0) {

              direction = 1;

           }

           else {

               direction = 2;

           }

       }

       else if (delta > 0) {

           delta2 = 2 * (delta + x) - 1;

           if (delta2 <= 0) {

              direction = 2;

           }

           else {

              direction = 3;

           }

       }

       else {

           direction = 2;

       }

       switch (direction) {

       case 1:

           x--;

           delta += 2 * (-x) + 1;

           break;

       case 2:

           x--;

           y++;

           delta += 2 * (-x + y + 1);

           break;

       case 3:

           y++;

           delta += (2 * y + 1);

           break;

       }

    }

    //画第四象限的圆弧

    x = 0;

    y = -r;

    delta = 2 * (1 - r);

    while (y <= 0) {

       putpixel(myx + x, myy + y, color);

       if (delta < 0) {

           delta1 = 2 * (delta - y) - 1;

           if (delta1 <= 0) {

              direction = 1;

           }

           else {

              direction = 2;

           }

       }

       else if (delta > 0) {

           delta2 = 2 * (delta - x) - 1;

           if (delta2 <= 0) {

              direction = 2;

           }

           else {

              direction = 3;

           }

       }

       else {

           direction = 2;

       }

       switch (direction) {

       case 1:

           x++;

           delta += 2 * x + 1;

           break;

       case 2:

           x++;

           y++;

           delta += 2 * (x + y + 1);

           break;

       case 3:

           y++;

           delta += (2 * y + 1);

           break;

       }

    }

}

int main() {

    //用户定义圆的相关参数

    int r,colornum;

    cout << "please input the radius of your circle" << endl;

    cin >> r;

    cout << endl;

    cout << "please choose a number to define the color of your circle" << endl;

    cout << "0:WHITE 1:RED 2:YELLOW" << endl;

    cin >> colornum;

    int colorarray[3] = { WHITE,RED,YELLOW };

    //图形界面

    initgraph(640, 480);

    ExMessage m;

    int x0, y0, x1, y1;

    while (true) {

       m = getmessage(EX_MOUSE | EX_KEY);

       switch (m.message) {

       case WM_LBUTTONDOWN:

           x0 = m.x;

           y0 = m.y;

           setfillcolor(GREEN);

           fillrectangle(m.x - 3, m.y - 3, m.x + 3, m.y + 3);

           Circle(m.x, m.y, r, colorarray[colornum]);

       case WM_KEYDOWN:

           if (m.vkcode == VK_ESCAPE)

              return 0;  // 按 ESC 键退出程序

       }

    }

    closegraph();

    return 0;

}

5

//

// 程序名称:画椭圆算法

// 功  能:画一个半长轴为a和半短轴为b的完整椭圆,用鼠标选择圆心位置

// 编译环境:VS2019,EasyX_20220116

// 最后修改:2022-3-10

#include <graphics.h>

#include <conio.h>

#include <iostream>

#include <cmath>

using namespace std;

void Oval(int myx, int myy, int a, int b, int color) {

    double xp, yp, d;

    int x, y;

    //第一象限

    xp = (double)a * a / sqrt(a * a + b * b);

    yp = (double)b * b / sqrt(a * a + b * b);

    //(0,b)=>p

    x = 0;

    y = b;

    d = b * b + (-b + 0.25) * a * a;

    while (x <= xp) {

       putpixel(x + myx, y + myy, color);

       if (d <= 0) {

           d = d + (2 * x + 3) * b * b;

           x++;

       }

       else {

           d = d + (x * 2 + 3) * b * b + (-2 * y + 2) * a * a;

           x++;

           y--;

       }

    }

    //p->(a,0)

    x = a;

    y = 0;

    d = (-a + 0.25) * b * b + a * a;

    while (y < yp) {

       putpixel(myx + x, myy + y, color);

       if (d <= 0) {

           d += (2 * y + 3) * a * a;

           y++;

       }

       else {

           d += (2 * y + 3) * a * a + (-2 * x + 2) * b * b;

           x--;

           y++;

       }

    }

    //第二象限

    xp = (double)-a * a / sqrt(a * a + b * b);

    yp = (double)b * b / sqrt(a * a + b * b);

    //(0,b)=>p

    x = 0;

    y = b;

    d = b * b + (-b + 0.25) * a * a;

    while (x >= xp) {

       putpixel(x + myx, y + myy, color);

       if (d <= 0) {

           d = d + (-2 * x + 3) * b * b;

           x--;

       }

       else {

           d = d + (-x * 2 + 3) * b * b + (-2 * y + 2) * a * a;

           x--;

           y--;

       }

    }

    //p->(a,0)

    x = -a;

    y = 0;

    d = (-a + 0.25) * b * b + a * a;

    while (y < yp) {

       putpixel(myx + x, myy + y, color);

       if (d <= 0) {

           d += (2 * y + 3) * a * a;

           y++;

       }

       else {

           d += (2 * y + 3) * a * a + (2 * x + 2) * b * b;

           x++;

           y++;

       }

    }

    //第三象限

    xp = (double)-a * a / sqrt(a * a + b * b);

    yp = (double)-b * b / sqrt(a * a + b * b);

    //(0,-b)=>p

    x = 0;

    y = -b;

    d = b * b + (-b + 0.25) * a * a;

    while (x >= xp) {

       putpixel(x + myx, y + myy, color);

       if (d <= 0) {

           d = d + (-2 * x + 3) * b * b;

           x--;

       }

       else {

           d = d + (-x * 2 + 3) * b * b + (2 * y + 2) * a * a;

           x--;

           y++;

       }

    }

    //p->(-a,0)

    x = -a;

    y = 0;

    d = (-a + 0.25) * b * b + a * a;

    while (y >= yp) {

       putpixel(myx + x, myy + y, color);

       if (d <= 0) {

           d += (-2 * y + 3) * a * a;

           y--;

       }

       else {

           d += (-2 * y + 3) * a * a + (2 * x + 2) * b * b;

           x++;

           y--;

       }

    }

    //第四象限

    xp = (double)a * a / sqrt(a * a + b * b);

    yp = (double)-b * b / sqrt(a * a + b * b);

    //(0,-b)=>p

    x = 0;

    y = -b;

    d = b * b + (-b + 0.25) * a * a;

    while (x <= xp) {

       putpixel(x + myx, y + myy, color);

       if (d <= 0) {

           d = d + (2 * x + 3) * b * b;

           x++;

       }

       else {

           d = d + (x * 2 + 3) * b * b + (2 * y + 2) * a * a;

           x++;

           y++;

       }

    }

    //p->(a,0)

    x = a;

    y = 0;

    d = (-a + 0.25) * b * b + a * a;

    while (y >= yp) {

       putpixel(myx + x, myy + y, color);

       if (d <= 0) {

           d += (-2 * y + 3) * a * a;

           y--;

       }

       else {

           d += (-2 * y + 3) * a * a + (-2 * x + 2) * b * b;

           x--;

           y--;

       }

    }

}

int main() {

    //用户定义椭圆的相关参数

    int a, b, colornum;

    cout << "please input the long and short parameters of your oval" << endl;

    cin >> a >> b;

    cout << endl;

    cout << "please choose a number to define the color of your oval" << endl;

    cout << "0:WHITE 1:RED 2:YELLOW" << endl;

    cin >> colornum;

    int colorarray[3] = { WHITE,RED,YELLOW };

    //图形界面

    initgraph(640, 480);

    ExMessage m;

    while (true) {

       m = getmessage(EX_MOUSE | EX_KEY);

       switch (m.message) {

       case WM_LBUTTONDOWN:

           setfillcolor(GREEN);

           fillrectangle(m.x - 3, m.y - 3, m.x + 3, m.y + 3);

           Oval(m.x, m.y, a, b, colorarray[colornum]);

       case WM_KEYDOWN:

           if (m.vkcode == VK_ESCAPE)

              return 0;  // 按 ESC 键退出程序

       }

    }

    closegraph();

    return 0;

}

6题 方法1

//

// 程序名称:有宽度线段的连接处处理

// 功  能:设计具有宽度的画线算法,并处理线条连接处出现缺口的问题

// 编译环境:VS2019,EasyX_20220116

// 最后修改:2022-3-10

#include <graphics.h>

#include <conio.h>

#include <iostream>

#include <cmath>

using namespace std;

void bresenham(int x0, int y0, int x1, int y1, int color) {

    int dx = abs(x1 - x0), sx = x0 < x1 ? 1 : -1;

    int dy = abs(y1 - y0), sy = y0 < y1 ? 1 : -1;

    int erro = (dx > dy ? dx : -dy) / 2;

    while (putpixel(x0, y0, color), x0 != x1 || y0 != y1) {

       int e2 = erro;

       if (e2 > -dx) {

           erro -= dy;

           x0 += sx;

       }

       if (e2 < dy) {

           erro += dx;

           y0 += sy;

       }

    }

}

int main() {

    //用户定义相关参数

    int x0, y0, x1, y1, width, x2, y2, x3, y3;

    cout << "Please input the first starting point:" << endl;

    cin >> x0 >> y0;

    cout << "Please input the first ending point:" << endl;

    cin >> x1 >> y1;

    cout << "Please input the second starting point:" << endl;

    cin >> x2 >> y2;

    cout << "Please input the second ending point:" << endl;

    cin >> x3 >> y3;

    //cout << "Please input the half width of your lines:" << endl;

    //cin >> width;//输入半宽度

    int mycolor[2] = { RED, YELLOW };

    /*

    double flag1 = (double)(y1 - y0) / (x1 - x0);

    double flag2 = (double)(y3 - y2) / (x3 - x2);

    //flag1>1 or flag1<-1 斜率大于1 采用横向补点

    //flag1<1 and flag1>-1 斜率小于1 采用纵向补点

    //flag2同理可得

    */

    //图形界面

    initgraph(640, 480);

    //线性加粗

    bresenham(x0, y0, x1, y1, mycolor[0]);

    //宽度确定为10像素

    for (int i = 0; i < 5; i++) {

       bresenham(x0 + i, y0, x1 + i, y1, mycolor[0]);

       bresenham(x0 - i, y0, x1 - i, y1, mycolor[0]);

    }

    for (int i = 0; i < 5; i++) {

       bresenham(x2 + i, y2, x3 + i, y3, mycolor[1]);

       bresenham(x2 - i, y2, x3 - i, y3, mycolor[1]);

    }

    //补充缺口

    _getch();

    closegraph();

    return 0;

}

6题 方法2

//

// 程序名称:有宽度线段的连接处处理

// 功  能:设计具有宽度的画线算法,并处理线条连接处出现缺口的问题

// 编译环境:VS2019,EasyX_20220116

// 最后修改:2022-3-10

#include <graphics.h>

#include <conio.h>

#include <iostream>

#include <cmath>

using namespace std;

void mineputpixel(int x, int y, int color) {

    putpixel(x, y, color);

    putpixel(x-1, y, color);

    putpixel(x+1, y, color);

    putpixel(x-1, y+1, color);

    putpixel(x, y+1, color);

    putpixel(x+1, y+1, color);

    putpixel(x, y-1, color);

    putpixel(x+1, y-1, color);

    putpixel(x-1, y-1, color);

}

void bresenham(int x0, int y0, int x1, int y1, int color) {

    int dx = abs(x1 - x0), sx = x0 < x1 ? 1 : -1;

    int dy = abs(y1 - y0), sy = y0 < y1 ? 1 : -1;

    int erro = (dx > dy ? dx : -dy) / 2;

    while (mineputpixel(x0, y0, color), x0 != x1 || y0 != y1) {

       int e2 = erro;

       if (e2 > -dx) {

           erro -= dy;

           x0 += sx;

       }

       if (e2 < dy) {

           erro += dx;

           y0 += sy;

       }

    }

}

int main() {

    //用户定义相关参数

    int x0, y0, x1, y1, x2, y2, x3, y3;

    cout << "Please input the first starting point:" << endl;

    cin >> x0 >> y0;

    cout << "Please input the first ending point:" << endl;

    cin >> x1 >> y1;

    cout << "Please input the second starting point:" << endl;

    cin >> x2 >> y2;

    cout << "Please input the second ending point:" << endl;

    cin >> x3 >> y3;

    int mycolor[2] = { RED, YELLOW };

    //图形界面

    initgraph(640, 480);

    bresenham(x0, y0, x1, y1, mycolor[0]);

    bresenham(x2, y2, x3, y3, mycolor[1]);

    _getch();

    closegraph();

    return 0;

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/411523.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JS内置对象1

JS中的对象分为&#xff1a;自定义对象、内置对象、浏览器对象内置对象&#xff1a;JS语言自带的一些对象&#xff0c;已经提高最基本的功能常见内置对象&#xff1a;Math、Date、Array、String学习内置对象可通过查阅文档&#xff0c;即MDN/W3C来查阅 …

3.1 微分中值定理

思维导图&#xff1a; 学习目标&#xff1a; 我会按照以下步骤来学习微分中值定理&#xff1a; 理解导数的定义和性质&#xff1a;在学习微分中值定理之前&#xff0c;首先要对导数的定义和性质有一个清晰的理解&#xff0c;包括导数的几何意义和导数存在的条件等。学习拉格朗…

作为大学生,你还不会搭建chatGPT微应用吗?

目录 引言ChatGPT是什么&#xff1f;背景&#xff1a;ChatGPT敢为人先&#xff0c;打破全球僵局示例演示&#xff1a;基于ChatGPT微应用实现的条件及步骤&#xff08;1&#xff09;整体框架&#xff08;2&#xff09;搭建前的准备工作&#xff08;3&#xff09;实际搭建步骤&a…

算法之搜索专题

搜索 深度优先搜索&#xff08;DFS&#xff09;和广度优先搜索&#xff08;BFS&#xff09;都是常见的图搜索算法。它们的目的是访问和遍历图中的所有节点&#xff0c;并找到满足特定条件的节点。虽然这两种算法的实现方式不同&#xff0c;但它们都有以下的特点。 首先&#…

或许能用 ChatGPT 插件实现财富自由

文章目录或许能用 ChatGPT 插件实现财富自由1. 认识一下1.1 是什么1.2 怎么用2. 举个例2.1 Wolfram2.2 Browsing3. 怎么做到的4. 财富自由4.1 生活类插件4.2 品牌推广类5. 限制或许能用 ChatGPT 插件实现财富自由 我们知道&#xff0c;当前 ChatGPT 最大的局限性就是模型训练数…

如何编写一个自己的web前端脚手架

脚手架简介 脚手架是创建前端项目的命令行工具&#xff0c;集成了常用的功能和配置&#xff0c;方便我们快速搭建项目&#xff0c;目前网络上也有很多可供选择的脚手架。 一个"简单脚手架"的构成其实非常少&#xff0c;即 代码模板 命令行工具。其中代码模板是脚手…

【李宏毅】-生成对抗式网络(GAN)

生成对抗式网络GAN 1. Network as Generator 输入不再是只是x&#xff0c;还有一个simple distribution&#xff08;样本分布&#xff09;&#xff0c;输出也是一个分布 Why distribution 不同的分布即意味着&#xff1a;相同的输入会有不同的输出。 尤其在任务需要创造力的时…

Win+VisualStudio+vcpkg+Zeromq安装方法

1. 缘由 因为工作上要用到Windows上的zeromq来收发消息&#xff0c;所以我在网上搜集了一些资料最终成功地在Visual Studio2022中用c的libzmq库实现了zmq的收发。 2. 基本资料 2.1 ZeroMQ基本介绍 ZeroMQ官网介绍&#xff0c;因为我也不是专门搞网络和通信的&#xff0c;就…

RocketMQ 事务消息 详解

&#x1f34a; Java学习&#xff1a;Java从入门到精通总结 &#x1f34a; 深入浅出RocketMQ设计思想&#xff1a;深入浅出RocketMQ设计思想 &#x1f34a; 绝对不一样的职场干货&#xff1a;大厂最佳实践经验指南 &#x1f4c6; 最近更新&#xff1a;2023年4月9日 &#x1…

VMware ESXi 8.0c - 领先的裸机 Hypervisor (sysin Custom Image)

本站发布 Dell 和 HPE 定制版 ESXi 8.0c 镜像 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-esxi-8/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org 产品简介 VMware ESXi&#xff1a;专门构建的裸机 Hyperviso…

【MATLAB数学建模编程实战】Kmeans算法编程及算法的简单原理

欢迎关注&#xff0c;本专栏主要更新MATLAB仿真、界面、基础编程、画图、算法、矩阵处理等操作&#xff0c;拥有丰富的实例练习代码&#xff0c;欢迎订阅该专栏&#xff01;&#xff08;等该专栏建设成熟后将开始收费&#xff0c;快快上车吧~~&#xff09; 【MATLAB数学建模编…

【MySQL数据库原理】MySQL Community安装与配置

目录 安装成功之后查看版本验证1、介绍、安装与配置数据库2、操作MySQL数据库3、MySQL数据库原理安装成功之后查看版本验证 SELECT VERSION();查看mysql版本号 1、介绍、安装与配置数据库 下载安装包:https://download.csdn.net/download/weixin_41194129/87672588 MySQL…

NumPy 秘籍中文第二版:二、高级索引和数组概念

原文&#xff1a;NumPy Cookbook - Second Edition 协议&#xff1a;CC BY-NC-SA 4.0 译者&#xff1a;飞龙 在本章中&#xff0c;我们将介绍以下秘籍&#xff1a; 安装 SciPy安装 PIL调整图像大小比较视图和副本翻转 Lena花式索引位置列表索引布尔值索引数独的步幅技巧广播数…

比尔·盖茨最新分享:ChatGPT的发展,不止于此

来源: 笔记侠 最近&#xff0c;ChatGPT、GPT 4、文心一言、Copilot&#xff0c;人工智能产品层出不容&#xff0c;一路轰炸&#xff1b;王慧文、王兴、李开复等各位高调以及低调的商业领袖和技术专家&#xff0c;纷纷入局AI赛道。人声鼎沸&#xff0c;十分热闹。 昨天&#xff…

自动写作ai-自动写作神器

自动生成文章 自动生成文章是指使用自然语言处理和人工智能技术&#xff0c;通过算法来自动生成文章的过程。一些自动生成文章的工具可以使用大量数据&#xff0c;学习数据背后的语言规范和知识结构&#xff0c;从而生成高质量和有用的文章。这种技术能够减少写作时间和人力成…

Nature子刊 定制饮食去除半胱氨酸和蛋氨酸可诱导细胞自毁进而治疗脑瘤?

恶性胶质瘤是成人最常见的脑部肿瘤。恶性胶质瘤的致死率为100%&#xff0c;无法治愈&#xff0c;是一种极度的恶性肿瘤。如此糟糕的预后促使研究者及神经外科医生不断学习研究肿瘤生物学&#xff0c;期望创造更好的疗法。神经外科助理教授Dominique Higgins博士从事肿瘤生物学的…

必胜方法,矩阵堆量

0x1 问题 今天不讲量化&#xff0c;来聊聊其他的 铁废柴一年到头也想不明白&#xff0c;那些几万人用的程序&#xff0c;几百万人关注的自媒体账号 到底是怎么做出来的啊 为什么我发一百个视频才赚100块钱 我要怎么才可以过上小康生活&#xff1f; 0x2 答案 矩阵&#xff…

WPF mvvm框架Stylet使用教程-特殊用法

事件绑定 除了绑定Command属性&#xff0c;在WPF中经常需要绑定一些事件的操作&#xff0c;在别的框架中需要引入其他包支持&#xff0c;在Stylet框架中&#xff0c;可以 同样使用s:Action进行绑定&#xff0c;对应绑定ViewModel中的方法。 示例&#xff1a; XAML:<Button…

中科网联CCData借助亚马逊云科技实现高效融媒体测量

近年来&#xff0c;随着媒体与广告传媒行业数字化转型向纵深发展&#xff0c;如何利用数据洞察用户生态、实现精准触达以及业务持续创新已成为媒体产业深入发展的“必答题”。与此同时&#xff0c;随着数据应用的不断深入&#xff0c;借助人工智能和机器学习技术&#xff0c;找…

TCP为什么要三次握手,而不是两次或四次?

文章目录TCP为什么要三次握手&#xff0c;而不是两次或四次&#xff1f;三次握手才可以阻止重复历史连接的初始化&#xff08;主要原因&#xff09;同步双方初始序列号避免资源浪费小结TCP为什么要三次握手&#xff0c;而不是两次或四次&#xff1f; TCP连接时用于保证可靠性和…