原文:疯狂的图形(利用C# + GDI plus模拟杂乱无章的现实场景)

本文给出了模拟竹叶、长叶草、杂乱石头、天上繁星等关键代码。使用.Net环境下C#语言,GDI+编写。

模拟竹叶

挺像的吧?谁说不像,我跟谁急!

//关键参数

int minCorners = 3;
int maxCorners =4;

PointF[] points = Stone.CreateStone(new Point((int)(perX * j), (int)(perY * i)), (int)(perX * 1.4f), (int)(perX * 0.009f), corners);

模拟长叶青草

说实话,这个不太像,太整齐了,应该再杂乱无章点。

//关键参数

int minCorners = 20;
int maxCorners =38;

PointF[] points = Stone.CreateStone(new Point((int)(perX * j), (int)(perY * i)), (int)(perX * 0.88f), (int)(perX * 0.01f), corners);
g.FillClosedCurve(Brushes.Green, points, FillMode.Winding);

模拟不规则的石块

这个……怎么有的石块总是多出来那么一点点,好像石头上长了草似的?如果被你发现,说明你是个细心的人。反之,说你粗心也不为过,哈哈!

//关键参数:

int minCorners = 3;
int maxCorners =4;

PointF[] points = Stone.CreateStone(new Point((int)(perX * j), (int)(perY * i)), (int)(perX * 0.4f), (int)(perX * 0.396f), corners);
g.FillClosedCurve(Brushes.Gray, points, FillMode.Winding);

天上星,亮晶晶

//关键参数:

int minCorners = 3;
int maxCorners =4;

PointF[] points = Stone.CreateStone(new Point((int)(perX * j), (int)(perY * i)), (int)(perX * 0.18f), (int)(perX * 0.06f), corners);
g.FillClosedCurve(Brushes.White, points, FillMode.Winding);

//关键代码:

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Text;

namespace ZPXP.Com.Util
{
    public static class Stone
    {
        public static PointF[] CreateStone(Point center, int outerRadius, int inner_radius, int arms)
        {
            int center_x = center.X;
            int center_y = center.Y;
            PointF[] points = new PointF[arms * 2];
            double offset = Math.PI / 2;
            double arc = 2 * Math.PI / arms;
            double half = arc / 2;
            double angle = 0;
            for (int i = 0; i < arms; i++)
            {
                Random randomOuter = new Random((int)DateTime.Now.Ticks);
                outerRadius = outerRadius - randomOuter.Next((int)(inner_radius * 0.06 * new Random().Next(-20,20) /30d), (int)(inner_radius * 0.08));
                //outerRadius = outerRadius - randomOuter.Next((int)(inner_radius * 0.16 * new Random().Next(-20, 20) / 30d), (int)(inner_radius * 0.18));
                Random randomInner = new Random(Guid.NewGuid().GetHashCode());
                inner_radius = inner_radius + randomInner.Next((int)(inner_radius * 0.02 * new Random().Next(-100,100) /150d), (int)(inner_radius * 0.08));
                //inner_radius = inner_radius + randomInner.Next((int)(inner_radius * 0.02 * new Random().Next(-100, 100) / 150d), (int)(inner_radius * 0.22));
              
                if (inner_radius > outerRadius)
                {
                    int temp = outerRadius;
                    outerRadius = inner_radius;
                    inner_radius = temp;
                }
                double angleTemp = arc * randomInner.Next(-5, 5) / 10d;
                angle = i * arc;
                angle += angleTemp;
                points[i * 2].X = (float)(center_x + Math.Cos(angle - offset) * outerRadius);
                points[i * 2].Y = (float)(center_y + Math.Sin(angle - offset) * outerRadius);
                points[i * 2 + 1].X = (float)(center_x + Math.Cos(angle + half - offset) * inner_radius);
                points[i * 2 + 1].Y = (float)(center_y + Math.Sin(angle + half - offset) * inner_radius);
            }

return points;
        }

}
}

测试用代码:

private void button3_Click(object sender, EventArgs e)
        {
            int width = 500;
            int height = 500;
            int x = 0;
            int y = 0;
            int numX = 10;
            int numY =10;
            float perX = width * 1f / numX;
            float perY = height * 1f / numY;
            Bitmap image = new Bitmap(width, height);
            Graphics g = Graphics.FromImage(image);

g.CompositingQuality = CompositingQuality.HighQuality;
            g.SmoothingMode = SmoothingMode.HighQuality;
            g.InterpolationMode = InterpolationMode.HighQualityBicubic;

g.FillRectangle(Brushes.Black, new Rectangle(0,0, width, height));

int minCorners = 3;
            int maxCorners =18;
            int lastCorners = minCorners;
            for (int i = 0; i < numX; i++)
            {
                for (int j = 0; j < numY; j++)
                {
                    long tick = DateTime.Now.Ticks;
                    Random random = new Random((int)(tick & 0xffffffff) | (int)(tick >> 32));
                    int corners = random.Next(minCorners, maxCorners);
                    if (Math.Abs(corners - lastCorners) < (maxCorners - minCorners) / 2) corners = RetrievRandomCorners(minCorners, maxCorners);
                    lastCorners = corners;
                    //PointF[] points = Stone.CreateStone(new Point((int)(perX * j), (int)(perY * i)), (int)(perX * 0.9f), (int)(perX * 0.8f), corners);
                    PointF[] points = Stone.CreateStone(new Point((int)(perX * j), (int)(perY * i)), (int)(perX * 0.18f), (int)(perX * 0.06f), corners);
                    g.FillClosedCurve(Brushes.White, points, FillMode.Winding);
                }
            }

picEncode.Image = image;

}

private int RetrievRandomCorners(int minCorners, int maxCorners)
        {
            return new Random(Guid.NewGuid().GetHashCode()).Next(minCorners, maxCorners);
        }

疯狂的图形(利用C# + GDI plus模拟杂乱无章的现实场景)相关推荐

  1. java编写的王八程序_利用JAVA多线程技术模拟龟兔赛跑.doc

    利用JAVA多线程技术模拟龟兔赛跑 摘要:该文介绍了利用JAVA语言的多线程技术,对"龟兔赛跑"寓言故事的模拟.从模拟程序的具体设计思路,到详细的实现过程,将技术的应用融入到一个有 ...

  2. Matlab:利用Matlab编程实现模拟分子布朗运动的动画展示

    Matlab:利用Matlab编程实现模拟分子布朗运动的动画展示 目录 输出结果 实现代码 输出结果 实现代码 %Brownian motion clf; n=20; s=0.02; x = rand ...

  3. Matlab:利用Matlab实现布朗运动模拟

    Matlab:利用Matlab实现布朗运动模拟 目录 输出结果 实现代码 输出结果 实现代码 n=40 s=0.04 x=rand(n,1)-0.5; y=rand(n,1)-0.5; h=plot( ...

  4. 利用 MPI 进行蒙特卡洛模拟

    参考 MPI对道路车辆情况的Nagel-Schreckenberg 模型进行蒙特卡洛模拟 实验题目 题目: 利用 MPI 进行蒙特卡洛模拟 内容: 在道路交通规划上,需要对单条道路的拥堵情况进行估计. ...

  5. 利用Spring扩展点模拟MyBatis的注解编程「知识点多多」「扩展点实战系列」- 第448篇

    历史文章(文章累计440+) <国内最全的Spring Boot系列之一> <国内最全的Spring Boot系列之二> <国内最全的Spring Boot系列之三> ...

  6. html5手电筒样式,利用HTML5实现SVG模拟手电筒照明特效

    特效描述:利用HTML5实现 SVG 模拟手电筒 照明特效.利用HTML5%20实现SVG模拟手电筒照明特效 代码结构 1. HTML代码 xmlns="http://www.w3.org/ ...

  7. chrome frame节点 取_爬虫3-下(利用Selenium + Chrome Driver模拟用户操作浏览器)

    一.前言 前面利用request的方法爬取页面数据的操作,今天用另外一种方法:利用Selenium + Chrome Driver模拟用户操作浏览器,来爬取数据. 在此之前需要做一些准备工作:安装se ...

  8. 利用计算机的随机模拟结果帮助学生,对小学数学课堂教学有效性的思考

    <对小学数学课堂教学有效性的思考>由会员分享,可在线阅读,更多相关<对小学数学课堂教学有效性的思考(11页珍藏版)>请在装配图网上搜索. 1.对小学数学课堂教学有效性的思考洱源 ...

  9. python模拟访问js_百度统计原理分析-利用PHP/Python实现模拟访问

    国内大多数站长可能都在用百度统计.统计的使用方法也很简单,只要在需要统计的页面底部加上统计代码即可.然后打开百度统计的后台,就能看到访客信息,包括入口页面,停留时间,跳出率等等,很是方便. 使用当然是 ...

  10. 利用python requests库模拟登陆知乎

    当初搜模拟登陆的时候在知乎上也找到一些内容. 以下是代码 import requests import time import json import os import re import sys ...

最新文章

  1. Swift2.x编写NavigationController动态缩放titleView
  2. 企业架构-发布【企业架构框架-TOGAF v0.1.pdf】
  3. 说出一些数据库优化方面的经验?
  4. 解决国内GitHub加载慢的问题
  5. python 2x与python 3x是否兼容_使.next()与Python2和3兼容
  6. mysql根据id删除数据sql语句_sql delete根据id删除数据库
  7. Adaboost、RandomFrest、GBRT的区别
  8. Provisional headers are shown问题
  9. linux 开源中文字体,有哪些免费的中文字体可以下载?
  10. java毕业设计开题报告论文基于JavaWeb项目实现的高校学生在线选课系统
  11. PS中抠图的几种方法简介
  12. 计算机应用结课PPT,计算机应用说课.ppt
  13. Android 运行程序报错:Unable to execute dex: Multiple dex files define Lcom/baidu/android/pushservice/Push
  14. python条件句格式_python条件语句是什么?条件语句的一般格式是什么样的?
  15. 2018安恒杯11月月赛 MISC
  16. AMS5601开发 AB角度磁编码器
  17. Lanius大数据治理平台
  18. 《SVN宇宙版教程》:第九章 Subclipse必备技能
  19. Jenkins 流水线说明
  20. NBIOT模块 BC20 OPENCPU LWM2M协议传输数据到OneNet平台

热门文章

  1. 【车间调度】基于matlab多层编码遗传算法求解车间调度问题【含Matlab源码 035期】
  2. io流不关闭会怎么样_关闭IO流,你确定不试试trywithresources?
  3. 与Maggy统一单主机和分布式机器学习
  4. android view 画文字,【Android自定义View】绘图之文字篇(三)
  5. mysql mvcc 并发update_关于mysql的InnoDB多版本并发控制(MVCC)与事务隔离级别的疑问?...
  6. python:读取mat文件
  7. python统计时间的次数的代码_python脚本实现统计日志文件中的ip访问次数代码分享...
  8. netbeans linux 安装教程,linux下安装NetBeans 6.0
  9. php valid函数,PHP函数uasort()在类中的使用问题解决
  10. 大型项目开发: 隔离 (《大规模C++程序设计》书摘)