精华内容
下载资源
问答
  • 很多人可能知道使用.NET Core...本文通过借助.NET三维绘图控件,可以方便地用C#编程语言在Linux下搭建一个集三维建模和三维显示于一身的.NET Core App。1 .NET Core环境搭建Linux下的编辑器推荐使用VS Code。以Ubun...

    很多人可能知道使用.NET Core可以开发跨平台(包括Windows,Linux、MacOS)的App,但知道在Linux下使用.NET Core可以开发三维程序的恐怕就很少了。本文通过借助.NET三维绘图控件,可以方便地用C#编程语言在Linux下搭建一个集三维建模和三维显示于一身的.NET Core App。

    1 .NET Core环境搭建

    Linux下的编辑器推荐使用VS Code。

    以Ubuntu20.04为例,搭建开发环境的步骤为:1.1 配置一下微软的包服务器

    配置一下包服务器

    wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb

    sudo dpkg -i packages-microsoft-prod.deb

    1.2 下载和安装SDK:

    sudo apt-get update

    sudo apt-get install apt-transport-https

    sudo apt-get update

    sudo apt-get install dotnet-sdk-3.1

    1.3 下载和安装.NET Core运行时

    sudo apt-get update

    sudo apt-get install apt-transport-https

    sudo apt-get update

    sudo apt-get install dotnet-runtime-3.1

    2 创建一个.NET Core App

    在控制台创建一个控制台App

    dotnet new console -o MyFirstApp

    编译一下:

    dotnet build

    就可以生成一个可执行程序。接下来我们要基于这个程序增加代码,来集成AnyCAD .NET Core三维控件。

    3 集成AnyCAD .NET Core

    3.1 引用程序集

    修改csproj文件

    Exenetcoreapp3.1

    netcoreapp3.1/AnyCAD.Foundation.NetCore.dll

    3.2 添加代码创建一个长方体

    修改program.cs

    using AnyCAD.Foundation;

    using System;

    namespace anycad.netcore.test

    {

    class Program

    {static void Main(string[] args){

    GlobalInstance.Initialize();

    WindowCanvas canvas = new WindowCanvas("AnyCAD DotNetCore");

    canvas.Initialize(0, 600, 400);

    var box = ShapeBuilder.MakeBox(GP.XOY(), 10,20,30);

    var node = ShapeSceneNode.Create(box, 0.01);

    var scene = canvas.GetContext().GetScene();

    scene.AddNode(node);

    canvas.Run();

    canvas.Destroy();

    GlobalInstance.Destroy();

    Console.WriteLine("Hello World!");

    }

    }

    }

    如果想创建更复杂的模型,可以参考AnyCAD github上的例子: https://github.com/anycad/anycad.rapid.net.sample

    3.3 编译运行

    效果如下:

    5ad25d9f925a0daffb9031ec77c1e394.png

    20200526172111.png

    总结

    随着硬件国产化、Linux操作系统国产化,CAD/CAE/CAM等三维应用也亟需国产化。基于AnyCAD .NET Core三维控件,借助AnyCAD .NET Core三维控件,也可以快速搭建三维建模和可视化的应用。

    作者:三维控件研究

    链接:https://www.jianshu.com/p/bf13722fe67d

    來源:简书

    简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

    展开全文
  • 这章概念是真的多,干脆直接把这些概念啊,函数啊放在实例里来说算了,方便理解。先把DirectX绘图的大概思路捋一遍:1.设置全局变量:包括 IDirect3DDevice9的实例*Device、屏幕的长(int width)...

    fce4e83271e43d96e3790a236fb8bc54.png

    看完二、三章,新的概念太多了,而且写过第一个例子之后回头再看第一章才能真正理解许多概念到底是什么意思,所以正确的方法应该是先粗略地读一下第一章,看完二三章再回头看第一章。这章概念是真的多,干脆直接把这些概念啊,函数啊放在实例里来说算了,方便理解。


    先把DirectX绘图的大概思路捋一遍:

    1.设置全局变量:包括 IDirect3DDevice9的实例*Device、屏幕的长(int width)和高(int height)、 是否窗口化(bool windowed)、顶点缓存的指针(IDirect3DVertexBuffer9 *vb)、引索缓存的指针(IDirect3DIndexBuffer9 *ib)等等,暂时用到这么多。

    2.设置灵活顶点格式(P60):本质上定义一个Vertex的结构体,可以自己写成员类型,但注意还要定义一个FVF标记来描述顶点格式,可以在结构体外面或里面用DWORD定义,可以宏定义,可以用的时候直接写。(有很多种,用的时候翻文档吧)

    3.setup()函数在本例中的功能:

    (1)顶点缓存分配空间Device->CreateVertexBuffer():

     HRESULT CreateVertexBuffer(
      UINT                   Length, /*分配顶点的字节数 (X * sizeof(Vertex)) */
      DWORD                  Usage,  /*附加属性P74*/
      DWORD                  FVF,    /*灵活顶点格式*/
      D3DPOOL                Pool,   /*内存池 每种特性不一样 P42*/
      IDirect3DVertexBuffer9 **ppVertexBuffer,  /*顶点缓存的指针*/
      HANDLE                 *pSharedHandle     /*一般为0*/
    );

    (2)引索缓存分配空间Device->CreateIndexBuffer():

    HRESULT CreateIndexBuffer(
      UINT                  Length, /*分配顶点的字节数 (X * sizeof(Vertex)) */
      DWORD                 Usage,  /*附加属性P74*/
      D3DFORMAT             Format, /*引索格式 翻文档*/
      D3DPOOL               Pool,   /*内存池 每种特性不一样 P42*/
      IDirect3DIndexBuffer9 **ppIndexBuffer,  /*引索缓存的指针*/
      HANDLE                *pSharedHandle     /*一般为0*/
    );

    (3)为顶点缓存赋值:

    流程:创建一个顶点指针(Vertex *vertices)--->锁定缓存区(vb->Lock(0, 0, (void**)&vertices, 0);)--->用vertices[]数组为顶点缓存赋值--->解锁缓存区(vb->Unlock();)

    (4)为引索缓存赋值:

    流程:创建一个引索指针(WORD *indices)--->锁定缓存区(ib->Lock(0, 0, (void**)&indices, 0);)--->用indices[]数组为顶点缓存赋值--->解锁缓存区(ib->Unlock();)

    4. Display()函数在本例中的功能(实例中有补充的注释):

    • 设定观察矩阵、投影矩阵。
    • 世界坐标系中的矩阵变换:物体的平移、旋转、缩放...
    • 观察坐标系中的矩阵变换:摄像机的平移、旋转、缩放...
    • 设定投影矩阵
    • 设定绘制状态(绘制三角形、点、线……)
    • 指定顶点缓存:Device->SetStreamSource();
    • 指定引索缓存:Device->SetIndices(ib);
    • 设置灵活顶点格式:Device->SetFVF(Vertex::FVF);
    • Device->BeginScene();
    • 进行绘制:Device->DrawIndexedPrimitive();
    • Device->EndScene();
    • Device->Present(0,0,0,0);

    5.Cleanup()函数在本例中的功能:

    • 释放顶点缓存:d3d::Release<IDirect3DVertexBuffer9*>(vb);
    • 释放引索缓存:d3d::Release<IDirect3DIndexBuffer9*>(ib);

    源代码commonFunc.h

    #pragma once
    #ifndef COMMONFUNC_H
    #define COMMONFUNC_H
    
    #include "d3dUtility.h"
    IDirect3DDevice9  *Device = 0;
    extern const int width = 1800;
    extern const int height = 900;
    extern bool windowed = true;
    
    IDirect3DVertexBuffer9 *vb = 0;  //顶点缓存
    IDirect3DIndexBuffer9 *ib = 0;   //引索缓存
    
    struct Vertex {
    	Vertex(){}
    	Vertex(float x, float y, float z) {
    		_x = x; _y = y; _z = z;
    	}
    	float _x, _y, _z;
    	static const DWORD FVF;
    };
    
    const DWORD Vertex::FVF = D3DFVF_XYZ;
    
    bool Setup() {
    	Device->CreateVertexBuffer(8 * sizeof(Vertex), D3DUSAGE_WRITEONLY, Vertex::FVF, D3DPOOL_MANAGED, &vb, 0);
    	Device->CreateIndexBuffer(36 * sizeof(WORD), D3DUSAGE_WRITEONLY, D3DFMT_INDEX16, D3DPOOL_MANAGED, &ib, 0);
    	Vertex *vertices;  //为获取顶点缓存内容而创建的指针
    	vb->Lock(0, 0, (void**)&vertices, 0);  //锁定顶点缓存
    
    	vertices[0] = Vertex(-1.0f, -1.0f, -1.0f);
    	vertices[1] = Vertex(-1.0f, 1.0f, -1.0f);
    	vertices[2] = Vertex(1.0f, 1.0f, -1.0f);
    	vertices[3] = Vertex(1.0f, -1.0f, -1.0f);
    	vertices[4] = Vertex(-1.0f, -1.0f, 1.0f);
    	vertices[5] = Vertex(-1.0f, 1.0f, 1.0f);
    	vertices[6] = Vertex(1.0f, 1.0f, 1.0f);
    	vertices[7] = Vertex(1.0f, -1.0f, 1.0f);
    
    	vb->Unlock();
    
    	WORD *indices = 0;
    	ib->Lock(0, 0, (void**)&indices, 0);
    
    	indices[0] = 0; indices[1] = 1; indices[2] = 2;
    	indices[3] = 0; indices[4] = 2; indices[5] = 3;
    	indices[6] = 4; indices[7] = 6; indices[8] = 5;
    	indices[9] = 4; indices[10] = 7; indices[11] = 6;
    	indices[12] = 4; indices[13] = 5; indices[14] = 1;
    	indices[15] = 4; indices[16] = 1; indices[17] = 0;
    	indices[18] = 3; indices[19] = 2; indices[20] = 6;
    	indices[21] = 3; indices[22] = 6; indices[23] = 7;
    	indices[24] = 1; indices[25] = 5; indices[26] = 6;
    	indices[27] = 1; indices[28] = 6; indices[29] = 2;
    	indices[30] = 4; indices[31] = 0; indices[32] = 3;
    	indices[33] = 4; indices[34] = 3; indices[35] = 7;
    
    	ib->Unlock();
    
    	return true;
    }
    
    void Cleanup() {
    	d3d::Release<IDirect3DVertexBuffer9*>(vb);
    	d3d::Release<IDirect3DIndexBuffer9*>(ib);
    
    }
    
    bool Display(float timeDelta) {
    	if (Device)
    	{
    		D3DXVECTOR3 position(0.0f, 0.0f, -3.0f);  //摄影机的位置坐标
    		D3DXVECTOR3 target(0.0f, 0.0f, 0.0f);     //摄像机看向的方向经过的一个点
    		D3DXVECTOR3 up(0.0f, 1.0f, 0.0f);         //世界坐标系向上的方向向量
    		D3DXMATRIX V;
    		D3DXMatrixLookAtLH(&V, &position, &target, &up);   //计算取景变换矩阵(观察矩阵)
    		Device->SetTransform(D3DTS_VIEW, &V);  //设定取景变换矩阵(观察矩阵)
    
    		D3DXMATRIX proj;  
    		D3DXMatrixPerspectiveFovLH(&proj, 3.1415926f*0.5f, (float)width / (float)height, 1.0f, 100.0f);
    		//计算投影矩阵    参数:[1]输出矩阵的地址  [2]视角广度(弧度制)  [3]横纵比  [4]最近能看见的距离  [5]最远能看见的距离
    		Device->SetTransform(D3DTS_PROJECTION, &proj);
    		//设定投影矩阵
    		Device->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME);
    		//设定绘制状态  参数 :[1]要改变的某类绘制状态  [2]将该类绘制状态改为...状态
    
    		D3DXMATRIX Rx, Ry;
    		D3DXMatrixRotationX(&Rx, 3.14f / 4.0f);
    		//绕x轴旋转45°
    
    		static float y = 0.0f;
    		D3DXMatrixRotationY(&Ry, y);
    		//绕y轴旋转timeDelta°
    		y += timeDelta;
    
    		if (y >= 6.28f)
    			y = 0.0f;
    
    		D3DXMATRIX p = Rx * Ry;
    		Device->SetTransform(D3DTS_WORLD, &p);
    		//改变世界坐标系
    
    		Device->SetStreamSource(0, vb, 0, sizeof(Vertex));
    		//指定数据输入源  参数[1]标识顶点缓存  [2]顶点缓存的指针 [3]偏移量(要使用要先检查D3DDEVCAPS2_STREAMOFFSET标记) [4]顶点元素大小(字节)  
    		Device->SetIndices(ib);
    		//设定引索缓存
    		Device->SetFVF(Vertex::FVF);
    		//设置灵活顶点格式
    
    		Device->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, RGB(0, 255, 255), 1.0f, 0);
    		//清空后台缓存把它变为某一种颜色并将其提供给前台缓存  
    		Device->BeginScene();
    		Device->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 8, 0, 12);
    		//进行绘制 参数[1]绘制图元类型 [2]引索的基数(P80) [3]最小引索值 [4]引用的顶点数 [5]读取起始点的元素的引索 [6]要绘制的图元总数
    		Device->EndScene();
    		Device->Present(0,0,0,0);
    	}
    	return true;
    }
    
    #endif
    
    

    效果:

    a4e7da19e79ad432b1856da29f624a48.png

    da78de1db146f1a289ccadba6f442c47.png

    注:该程序中立方体的旋转是通过旋转世界坐标,即整个世界都会旋转,单独旋转某个物体的方法还不知道。

    展开全文
  • VC绘图图形库

    热门讨论 2011-12-21 10:16:16
     所以,我想给大家一个更好的学习平台,就是 VC 方便开发平台和 TC 简单的绘图功能,于是就有了这个 EasyX 库。如果您刚开始学 C 语言,或者您是一位教 C 语言的老师,再或者您在教计算机图形学,那么这个库一定...
  • 文章目录常用第三方模块pillow 图像处理标准库requests 更方便地处理urlchardet 检测编码方式psutil 获取系统信息virtualenv 隔离运行环境图形界面(较复杂)海龟绘图网络编程TCP/IPTCP编程 常用第三方模块 pillow ...

    常用第三方模块

    pillow 图像处理标准库

    可以打开图片后进行缩放、模糊等操作

    from PIL import Image
    # 打开一个jpg图像文件,注意是当前路径:
    im = Image.open('test.jpg')
    # 获得图像尺寸:
    w, h = im.size
    print('Original image size: %sx%s' % (w, h))
    # 缩放到50%:
    im.thumbnail((w//2, h//2))
    print('Resize image to: %sx%s' % (w//2, h//2))
    # 把缩放后的图像用jpeg格式保存:
    im.save('thumbnail.jpg', 'jpeg')
    # 应用模糊滤镜:
    im2 = im.filter(ImageFilter.BLUR)
    im2.save('blur.jpg', 'jpeg')
    

    输出字母验证码

    from PIL import Image, ImageDraw, ImageFont, ImageFilter
    
    import random
    # 随机字母:
    def rndChar():
        return chr(random.randint(65, 90))
    # 随机颜色1:
    def rndColor():
        return (random.randint(64, 255), random.randint(64, 255), random.randint(64, 255))
    # 随机颜色2:
    def rndColor2():
        return (random.randint(32, 127), random.randint(32, 127), random.randint(32, 127))
    # 240 x 60:
    width = 60 * 4
    height = 60
    image = Image.new('RGB', (width, height), (255, 255, 255))
    # 创建Font对象:
    font = ImageFont.truetype('arial.ttf', 36)
    # 创建Draw对象:
    draw = ImageDraw.Draw(image)
    # 填充每个像素:
    for x in range(width):
        for y in range(height):
            draw.point((x, y), fill=rndColor())
    # 输出文字:
    for t in range(4):
        draw.text((60 * t + 10, 10), rndChar(), font=font, fill=rndColor2())
    # 模糊:
    image = image.filter(ImageFilter.BLUR)
    image.save('code.jpg', 'jpeg')
    

    requests 更方便地处理url

    比uillib方便很多

    import requests
    headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}
    url = 'https://www.douban.com/'
    r = requests.get(url, headers=headers)
    print(r.status_code)
    print(r.text)
    
    #增加参数
     r = requests.get('https://www.douban.com/search', params={'q': 'python', 'cat': '1001'})
    
     #可以直接获取json
     r.json()
    
     #发送post也很方便,data后面为post请求的数据
      r = requests.post('https://accounts.douban.com/login', data={'form_email': 'abc@example.com', 'form_password': '123456'})
    
     #requests默认使用application/x-www-form-urlencoded对POST数据编码,可转成json
    params = {'key': 'value'}
    r = requests.post(url, json=params) # 内部自动序列化为JSON
    
    #上传文件也很方便
    upload_files = {'file': open('report.xls', 'rb')}
    r = requests.post(url, files=upload_files)
    

    除了能轻松获取响应内容外,requests对获取HTTP响应的其他信息也非常简单

    >>> r.headers['Content-Type']
    #结果
    'text/html; charset=utf-8'
    
    #自动解析cookies
    >>> r.cookies['ts']
    'example_cookie_12345'
    
    #传入cookies
    >>> cs = {'token': '12345', 'status': 'working'}
    >>> r = requests.get(url, cookies=cs)
    
    #指定超时
    >>> r = requests.get(url, timeout=2.5) # 2.5秒后超时
    

    chardet 检测编码方式

    当遇到不知道是什么编码的byte时,可以使用chardet。

    >>> data = '离离原上草,一岁一枯荣'.encode('gbk')
    >>> chardet.detect(data)#confidence为检测概率,GB2312不包括所有中文
    {'encoding': 'GB2312', 'confidence': 0.7407407407407407, 'language': 'Chinese'}
    

    psutil 获取系统信息

    可以用来监控系统、运维

    #统计CPU的用户/系统/空闲时间:
    >>> psutil.cpu_times()
    scputimes(user=10963.31, nice=0.0, system=5138.67, idle=356102.45)
    
    #每秒刷新使用率
    for x in range(10):
        print(psutil.cpu_percent(interval=1, percpu=True))
    
    #物理内存和交换内存
    >>> psutil.virtual_memory()
    svmem(total=8589934592, available=2866520064, percent=66.6, used=7201386496, free=216178688, active=3342192640, inactive=2650341376, wired=1208852480)
    >>> psutil.swap_memory()
    sswap(total=1073741824, used=150732800, free=923009024, percent=14.0, sin=10705981440, sout=40353792)
    
    #获取网络接口等
    >>> psutil.net_io_counters() # 获取网络读写字节/包的个数
    snetio(bytes_sent=3885744870, bytes_recv=10357676702, packets_sent=10613069, packets_recv=10423357, errin=0, errout=0, dropin=0, dropout=0)
    >>> psutil.net_if_addrs() # 获取网络接口信息
    {
      'lo0': [snic(family=<AddressFamily.AF_INET: 2>, address='127.0.0.1', netmask='255.0.0.0'), ...],
      'en1': [snic(family=<AddressFamily.AF_INET: 2>, address='10.0.1.80', netmask='255.255.255.0'), ...],
      'en0': [...],
      'en2': [...],
      'bridge0': [...]
    }
    >>> psutil.net_if_stats() # 获取网络接口状态
    {
      'lo0': snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_UNKNOWN: 0>, speed=0, mtu=16384),
      'en0': snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_UNKNOWN: 0>, speed=0, mtu=1500),
      'en1': snicstats(...),
      'en2': snicstats(...),
      'bridge0': snicstats(...)
    }
    
    #获取进程
    >>> psutil.pids() # 所有进程ID
    [3865, 3864, 3863, 3856, 3855, 3853, 3776, ..., 45, 44, 1, 0]
    >>> p = psutil.Process(3776) # 获取指定进程ID=3776,其实就是当前Python交互环境
    >>> p.name() # 进程名称
    'python3.6'
    >>> p.exe() # 进程exe路径
    '/Users/michael/anaconda3/bin/python3.6'
    >>> p.cwd() # 进程工作目录
    '/Users/michael'
    >>> p.cmdline() # 进程启动的命令行
    ['python3']
    >>> p.ppid() # 父进程ID
    3765
    >>> p.parent() # 父进程
    <psutil.Process(pid=3765, name='bash') at 4503144040>
    >>> p.children() # 子进程列表
    []
    >>> p.status() # 进程状态
    'running'
    >>> p.username() # 进程用户名
    'michael'
    >>> p.create_time() # 进程创建时间
    1511052731.120333
    >>> p.terminal() # 进程终端
    '/dev/ttys002'
    >>> p.cpu_times() # 进程使用的CPU时间
    pcputimes(user=0.081150144, system=0.053269812, children_user=0.0, children_system=0.0)
    >>> p.memory_info() # 进程使用的内存
    pmem(rss=8310784, vms=2481725440, pfaults=3207, pageins=18)
    >>> p.open_files() # 进程打开的文件
    []
    >>> p.connections() # 进程相关网络连接
    []
    >>> p.num_threads() # 进程的线程数量
    1
    >>> p.threads() # 所有线程信息
    [pthread(id=1, user_time=0.090318, system_time=0.062736)]
    >>> p.environ() # 进程环境变量
    {'SHELL': '/bin/bash', 'PATH': '/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:...', 'PWD': '/Users/michael', 'LANG': 'zh_CN.UTF-8', ...}
    >>> p.terminate() # 结束进程
    Terminated: 15 <-- 自己把自己结束了
    

    你可能会得到一个AccessDenied错误,原因是psutil获取信息也是要走系统接口,而获取网络连接信息需要root权限,这种情况下,可以退出Python交互环境,用sudo重新启动。

    virtualenv 隔离运行环境

    一般做网页隔离项目使用,不展开了,使用anaconda也可以。

    https://pythonguidecn.readthedocs.io/zh/latest/dev/virtualenvs.html
    https://www.jianshu.com/p/a83a8f5d68dd?utm_campaign=maleskine&utm_content=note&utm_medium=writer_share&utm_source=weibo

    图形界面(较复杂)

    Python 支持TK GTK QT等多个图形库,自带支持TK的tkinter

    我们编写的Python代码会调用内置的Tkinter,Tkinter封装了访问Tk的接口;

    Tk是一个图形库,支持多个操作系统,使用Tcl语言开发;

    Tk会调用操作系统提供的本地GUI接口,完成最终的GUI。

    所以,我们的代码只需要调用Tkinter提供的接口就可以了。

    from tkinter import *
    import tkinter.messagebox as messagebox
    #从Frame派生一个Application类,这是所有Widget的父容器
    class Application(Frame):
        def __init__(self, master=None):
            Frame.__init__(self, master)
            self.pack()
            self.createWidgets()
    
        def createWidgets(self):
            self.nameInput = Entry(self)
            self.nameInput.pack()
            self.alertButton = Button(self, text='Hello', command=self.hello)
            self.alertButton.pack()
    
        def hello(self):
            name = self.nameInput.get() or 'world'
            messagebox.showinfo('Message', 'Hello, %s' % name)
    #第三步,实例化
    app = Application()
    # 设置窗口标题:
    app.master.title('Hello World')
    # 主消息循环:
    app.mainloop()
    

    在GUI中,每个Button、Label、输入框等,都是一个Widget。Frame则是可以容纳其他Widget的Widget,所有的Widget组合起来就是一棵树。

    pack()方法把Widget加入到父容器中,并实现布局。pack()是最简单的布局,grid()可以实现更复杂的布局。

    https://www.cnblogs.com/collectionne/p/6885066.html
    具体原理解释

    海龟绘图

    方便地绘图,不展开

    网络编程

    用Python进行网络编程,就是在Python程序本身这个进程内,连接别的服务器进程的通信端口进行通信。

    TCP/IP

    IP协议负责把数据从一台计算机通过网络发送到另一台计算机。数据被分割成一小块一小块,然后通过IP包发送出去。由于互联网链路复杂,两台计算机之间经常有多条线路,因此,路由器就负责决定如何把一个IP包转发出去。IP包的特点是按块发送,途径多个路由,但不保证能到达,也不保证顺序到达。

    TCP协议则是建立在IP协议之上的。TCP协议负责在两台计算机之间建立可靠连接,保证数据包按顺序到达。TCP协议会通过握手建立连接,然后,对每个IP包编号,确保对方按顺序收到,如果包丢掉了,就自动重发。
    一个TCP报文除了包含要传输的数据外,还包含源IP地址和目标IP地址,源端口和目标端口。

    许多常用的更高级的协议都是建立在TCP协议基础上的,比如用于浏览器的HTTP协议、发送邮件的SMTP协议等。

    TCP编程

    Socket是网络编程的一个抽象概念。通常我们用一个Socket表示“打开了一个网络链接”,而打开一个Socket需要知道目标计算机的IP地址和端口号,再指定协议类型即可。

    客户端
    创建TCP连接时主动的一方。

    80为web服务的标准端口,25SMTP,21FTP

    # 导入socket库:
    import socket
    # 创建一个socket:AF_INET为IPV4,STREAM面向流的TCP协议
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 建立连接:
    s.connect(('www.sina.com.cn', 80))
    # 发送数据:要求返回首页内容
    s.send(b'GET / HTTP/1.1\r\nHost: www.sina.com.cn\r\nConnection: close\r\n\r\n')
    # 接收数据:
    buffer = []
    while True:
        # 每次最多接收1k字节:
        d = s.recv(1024)
        if d:
            buffer.append(d)
        else:
            break
    data = b''.join(buffer)
    s.close()
    header, html = data.split(b'\r\n\r\n', 1)
    print(header.decode('utf-8'))
    # 把接收的数据写入文件:
    with open('sina.html', 'wb') as f:
        f.write(html)
    

    服务器

    服务器进程首先要绑定一个端口并监听来自其他客户端的连接。如果某个客户端连接过来了,服务器就与该客户端建立Socket连接,随后的通信就靠这个Socket连接了。

    服务器地址、服务器端口、客户端地址、客户端端口来唯一确定一个Socket。

    建立服务器

    import socket
    import threading
    import time
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 监听端口:
    s.bind(('127.0.0.1', 9999))
    #开始监听,最大五个
    s.listen(5)
    print('Waiting for connection...')
    
    def tcplink(sock, addr):
        print('Accept new connection from %s:%s...' % addr)
        sock.send(b'Welcome!')
        while True:
            data = sock.recv(1024)
            time.sleep(1)
            if not data or data.decode('utf-8') == 'exit':
                break
            sock.send(('Hello, %s!' % data.decode('utf-8')).encode('utf-8'))
        sock.close()
        print('Connection from %s:%s closed.' % addr)
    
    while True:
        # 接受一个新连接:
        sock, addr = s.accept()
        # 创建新线程来处理TCP连接:
        t = threading.Thread(target=tcplink, args=(sock, addr))
        t.start()
    

    建立客户

    import socket
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 建立连接:
    s.connect(('127.0.0.1', 9999))
    # 接收欢迎消息:
    print(s.recv(1024).decode('utf-8'))
    for data in [b'Michael', b'Tracy', b'Sarah']:
        # 发送数据:
        s.send(data)
        print(s.recv(1024).decode('utf-8'))
    s.send(b'exit')
    s.close()
    

    UDP编程

    UDP:面向无连接的协议,使用UDP协议时,不需要建立连接,只需要知道对方的IP地址和端口号,就可以直接发数据包。但是,能不能到达就不知道了。

    不进行展开

    电子邮件

    简单的说就是
    写邮件——MUA:Mail User Agent邮件用户代理——MTA:Mail Transfer Agent邮件传输代理——MDA:Mail Delivery Agent邮件投递代理——到达。

    SMTP发送和POP3接收
    收发邮件一般用不到,不进行展开了

    https://www.liaoxuefeng.com/discuss/969955749132672/1195416737827328

    访问数据库

    为了便于程序保存和读取数据,而且,能直接通过条件快速查询到指定的数据,就出现了数据库(Database)这种专门用于集中存储和查询的软件。

    要操作关系数据库,首先需要连接到数据库,一个数据库连接称为Connection;

    连接到数据库后,需要打开游标,称之为Cursor,通过Cursor执行SQL语句,然后,获得执行结果。

    Python定义了一套操作数据库的API接口,任何数据库要连接到Python,只需要提供符合Python标准的数据库驱动即可。

    sqlite3的小例子(python内置)
    根据成绩范围找出名字和排序

    # -*- coding: utf-8 -*-
    
    import os, sqlite3
    
    db_file = os.path.join(os.path.dirname(__file__), 'test.db')
    if os.path.isfile(db_file):
        os.remove(db_file)
    
    # 初始数据:
    conn = sqlite3.connect(db_file)
    cursor = conn.cursor()
    cursor.execute('create table user(id varchar(20) primary key, name varchar(20), score int)')
    cursor.execute(r"insert into user values ('A-001', 'Adam', 95)")
    cursor.execute(r"insert into user values ('A-002', 'Bart', 62)")
    cursor.execute(r"insert into user values ('A-003', 'Lisa', 78)")
    cursor.close()
    conn.commit()
    conn.close()
    
    def get_score_in(low, high):
        ' 返回指定分数区间的名字,按分数从低到高排序 '
        conn = sqlite3.connect(db_file)
        cursor = conn.cursor()
        try:
            cursor.execute('select name from user where score BETWEEN ? AND ? order by score', (low, high))
            return list(map(lambda x: x[0], cursor.fetchall()))
        finally:
            cursor.close()
            conn.close()
    # 测试:
    assert get_score_in(80, 95) == ['Adam'], get_score_in(80, 95)
    assert get_score_in(60, 80) == ['Bart', 'Lisa'], get_score_in(60, 80)
    assert get_score_in(60, 100) == ['Bart', 'Lisa', 'Adam'], get_score_in(60, 100)
    
    print('Pass')
    

    Mysql实在安装不上,跳过

    Web开发

    CS架构:服务器-客户机,即Client-Server(C/S)结构。C/S结构通常采取两层结构。服务器负责数据的管理,客户机负责完成与用户的交互任务。

    BS架构:浏览器和服务器架构模式.
    在这种架构下,用户工作界面是通过WWW浏览器来实现,极少部分事务逻辑在前端(Browser)实现,但是主要事务逻辑在服务器端(Server)实现,形成所谓三层3-tier结构。B/S架构是WEB兴起后的一种网络架构模式,WEB浏览器是客户端最主要的应用软件。这种模式统一了客户端,将系统功能实现的核心部分集中到服务器上,简化了系统的开发、维护和使用。

    Python有上百种Web开发框架,有很多成熟的模板技术,选择Python开发Web应用,不但开发效率高,而且运行速度快。

    HTTP协议简介

    在Web应用中,服务器把网页传给浏览器,实际上就是把网页的HTML代码发送给浏览器,让浏览器显示出来。而浏览器和服务器之间的传输协议是HTTP.

    HTML是一种用来定义网页的文本,会HTML,就可以编写网页;

    HTTP是在网络上传输HTML的协议,用于浏览器和服务器的通信。

    HTTP协议同时具备极强的扩展性,虽然浏览器请求的是http://www.sina.com.cn/的首页,但是新浪在HTML中可以链入其他服务器的资源,比如,从而将请求压力分散到各个服务器上,并且,一个站点可以链接到其他站点,无数个站点互相链接起来,就形成了World Wide Web,简称“三达不溜”(WWW)

    具体步骤:
    1、浏览器向服务器发送一个 HTTP 格式的 request(post比get多个body)
    2、服务器处理 request,向浏览器返回一个 Http 格式的 response;
    3、重复1、2步,请求其他资源。

    HTML

    HTML文档就是一系列的Tag组成,最外层的Tag是。规范的HTML也包含…和…(注意不要和HTTP的Header、Body搞混了),由于HTML是富文档模型,所以,还有一系列的Tag用来表示链接、图片、表格、表单等等。

    CSS简介

    CSS是Cascading Style Sheets(层叠样式表)的简称,CSS用来控制HTML里的所有元素如何展现,比如,给标题元素

    加一个样式,变成48号字体,灰色,带阴影

    JavaScript简介

    JavaScript是为了让HTML具有交互性而作为脚本语言添加的,JavaScript既可以内嵌到HTML中,也可以从外部链接到HTML中。如果我们希望当用户点击标题时把标题变成红色,就必须通过JavaScript来实现(交互逻辑)

    展开全文
  • 为了方便大家阅读,现在将《BlackBerry上使用OpenGL绘图》一文的所有章节汇总起来,点击链接可以直接访问。 BlackBerry上使用OpenGL绘图 在BlackBerry上进行图像相关的编程有很多方式,开发人员可以通过Graphics...

    为了方便大家阅读,现在将《BlackBerry上使用OpenGL绘图》一文的所有章节汇总起来,点击链接可以直接访问。

    BlackBerry上使用OpenGL绘图

    在BlackBerry上进行图像相关的编程有很多方式,开发人员可以通过Graphics编程接口在屏幕上完成复杂的图像展现。但是,如果开发人员希望实现3D图像编程的话,直接使用Graphics接口则显得有些力不从心,开发人员需要通过代码实现3D图像相关的工作,包括坐标轴定义、平移计算、旋转计算、投影计算等。这种方式工作量很大,对系统要求很高,无法和硬件直接配合,很难用于开发复杂的3D应用。

    为了提供更为强大,更为方便的3D开发接口,新的BlackBerry平台上引入了OpenGL,通过它开发人员可以快速实现复杂的3D应用。因为OpenGL与平台结合比较紧密,它的编程方式与一般的BlackBerry应用不同,所以在BlackBerry开发环境中专门有一个OpenGL的样例。本章通过BlackBerry开发环境自带的OpenGL样例的介绍为读者讲解BlackBerry上使用OpenGL的方法。

    OpenGL本身是一个复杂的课题,它涉及到图形处理很多具体方面,而其中任何一个具体方面,比如光照、纹理、视图等等,都需要花费大量时间和精力去学习。这里不希望,也不可能以短短的一章内容介绍OpenGL的全部内容,只希望通过简单的说明让BlackBerry开发人员可以快速地进入OpenGL的世界。如果读者需要详细学习OpenGL的相关知识,请参考OpenGL的相关文章。当然,为了结合代码的讲解,在本章中会对一些基本的OpenGL概念或者是3D图形的概念进行简要讲解。

    OpenGL介绍

    http://blog.csdn.net/keyboardota/article/details/6804608

    运行OpenGL样例
    http://blog.csdn.net/keyboardota/article/details/6804631

    OpenGL样例结构分析
    http://blog.csdn.net/keyboardota/article/details/6807001

    顶点数组与法向量数组
    http://blog.csdn.net/keyboardota/article/details/6807080

    动画的产生
    http://blog.csdn.net/keyboardota/article/details/6818161

    3D变换介绍
    http://blog.csdn.net/keyboardota/article/details/6818170

    视图变换:观察点的运动
    http://blog.csdn.net/keyboardota/article/details/6818174

    模型变换:模型的运动
    http://blog.csdn.net/keyboardota/article/details/6821548

    投影变换
    http://blog.csdn.net/keyboardota/article/details/6821559

    视口变换
    http://blog.csdn.net/keyboardota/article/details/6821590

    纹理数组
    http://blog.csdn.net/keyboardota/article/details/6825962

    光照
    http://blog.csdn.net/keyboardota/article/details/6825994

    小结

    本章内容简单介绍了在BlackBerry上如何使用OpenGL进行3D绘图,限于篇幅的原因,很多有关OpenGL和OpenGL ES的内容都没有详细讨论。读者可以将本节内容作为BlackBerry上OpenGL开发的入门资料,有关更多的内容可以参考OpenGL的专业资料。

    展开全文
  • BCB6编程实例精讲

    2011-01-11 22:24:24
    C++Builder 6相比于5以前的版本,提供了更多的网络开发组件,更快速方便的可视化环境。 本书共有14章,前三章分别介绍C++Builder的开发环境、比较特殊的语法,并在第三章用实例讲述使用C++Builder开发应用程序的过程...
  • 3天掌握Windows GDI+图形编程

    千人学习 2019-08-23 01:02:09
    GDI的出现使程序员无需要关心硬件设备及设备驱动,就可以将应用程序的输出转化为硬件设备上的输出,实现了程序开发者与硬件设备的隔离,大大方便开发工作。        GDI+(Graphics Device ...
  • MATLAB是MathWorks公司开发的科学计算环境,具有强大的计算绘图能力,提供大量的函数库、工具箱,几乎涵盖了所有的工程计算领域,被誉为“演算纸”式的工程计算工具。但是MATLAB语言是一种解释...
  • 关键词: VB VC++ MATLAB DLL 编译 MATLAB Add-inMATLAB是MathWorks公司开发的科学计算环境,具有强大的计算绘图能力,提供大量的函数库、工具箱,几乎涵盖了所有的工程...
  • C++Builder 6相比于5以前的版本,提供了更多的网络开发组件,更快速方便的可视化环境。 本书共有14章,前三章分别介绍C++Builder的开发环境、比较特殊的语法,并在第三章用实例讲述使用C++Builder开发应用程序的过程...
  • QCad是开放源代码的LINUX CAD软件,它使用户能够在LINUX中快速、稳定、方便的使用CAD。使用QCad的用户不用有CAD编程的基础知识就能够轻松使用QCad。  Qcad 是一个用于 2D 和制图的计算机辅助设计(CAD)软件包。它...
  • C++Builder 6 相比于5 以前的版本,提供了更多的网络开发组件,更快速方便的可视化环境。本书共有14 章,前三章分别介绍C++Builder 的开发环境、比较特殊的语法,并在第三章用实例讲述使用C++Builder 开发应用程序的...
  • Matlab与c语言混合编程接口方法

    千次阅读 2015-05-25 20:34:38
    MATLAB作为世界顶尖的数学应用软件,以其强大的工程计算、算法研究、工程绘图、应用程序开发、数据分析和动态仿真等功能,在航空航天、机械制造和工程建筑等领域发挥着越来越重要的作用。而C语言功能丰富,使用灵活...
  • 每个图形都是对象,拥有众多的属性和函数,可以方便地编辑和操纵。 7.支持报表开发,表格高度智能,可以制作超酷图形界面,轻松换肤。 8.非常容易地开发出任何复杂变化的图形,轻松实现自己的图形库。 9.技术...
  • 在安装完毕Python的解释器之后,我们的电脑已经具备了Python编程的能力,但是使用已经开发好的PyCharm平台,可以让我们在编程时忽略格式带来的影响,同时借用目前已有的第三方类库进行扩展开发。使用Python语言完成...
  • GPT(Graphical Programming Tools)是作者积多年数控线切割编程经验,在原有的经过多年实用考验的系统基础上研制开发的新一代线切割机床自动编程软件,经过不断充实,目前该软件的1.0版已不仅能处理线切割的编程...
  • Android高级编程--源代码

    热门讨论 2013-02-06 17:39:21
    而富有经验的移动开发人员现在也可以方便地扩展到Android平台上来,利用它独特的功能来改进现有产品或者开发其他新奇产品。  本书将指导你使用Androidl.0软件开发包来构建移动应用程序。在每章的讲解中,它会让你...
  • MATLAB作为世界顶尖的数学应用软件,以其强大的工程计算、算法研究、工程绘图、应用程序开发、数据分析和动态仿真等功能,在航空航天、机械制造和工程建筑等领域发挥着越来越重要的作用。而C语言功能丰富,使用灵活...
  • AutoCAD二次开发

    2010-06-18 17:10:40
    使用VB,VC等开发语言对AutoCAD绘图软件进行开发, 也可以使用AutoCAD自带的VBA进行开发 对于不同的开发语言,使用的二次开发技术也不一样,VC中一般使用AutoLisp,VB使用ActiveX Automation较为快捷,最为方便的就是使用...
  •  InteGNPS经过多年的开发并进行不断的完善,实践应用证明该软件运行稳定可靠、编程精确,功能完备,软件的各功能具有智能性,使用方便,易学易用。  InteGNPS 在数控切割机编程行业中处于领先地位。  InteGNPS ...
  • matlab混合编程软件matcom4.5 Matcom是一个十分有用的.m文件翻译器(Replacement),它的主要优点我认为有 以下几点: 1>它提供了matlab中.m文件与其他高级语言的接口,使.m文件可以编译为脱离 matlab环境独立执行...
  • 事实上,这些类库和控件都是构筑在Windows API的基础上的,但它们使用方便,加速了Windows应用程序的开发,所以受到程序员的普遍采用。有了这些类库和控件,程序员们便可以把主要精力放在整体功能的设计上,而不必...
  • Android高级编程--详细书签版

    热门讨论 2013-02-06 17:37:52
    而富有经验的移动开发人员现在也可以方便地扩展到Android平台上来,利用它独特的功能来改进现有产品或者开发其他新奇产品。  本书将指导你使用Androidl.0软件开发包来构建移动应用程序。在每章的讲解中,它会让你...
  • 统达线切割软件是台湾统达电脑股份有限公司出品的线切割编程软件。 软件介绍: 1. 专业的绘图功能 a.) 提供特有的89种画圆方法,可动态拖曳有效取得结果(demo dwg) b.) 提供快速且弹性的矩形绘图 (BOX) c) 提供结合...
  • 这就是提供 VC 方便开发平台和 TC 简单的绘图功能,于是就有了这个 EasyX 库。如果您刚开始学 C 语言,或者您是一位教 C 语言的老师,再或者您在教计算机图形学,那么这个库一定会让您兴奋的。

空空如也

空空如也

1 2 3 4 5 ... 10
收藏数 188
精华内容 75
关键字:

方便编程开发绘图