一、认识RadialGradientBrush(径向渐变)

1.坐标

RadialGradientBrush可以用来填充矩形(正方形)和椭圆(正圆),

填充区域使用比例坐标,

椭圆的坐标(0,0)和(1,1)构成的矩形内切于椭圆

2.设置径向渐变颜色GradientStop

<GradientStop Color="" Offset="" />

GradientStop 在计算机图形中,渐变停止是指渐变色的终点,用于定义渐变色的起点和终点之间的颜色变化

基于渐变的特点

①区分起点/终点,一组GradientStop按照ofset的值排序,最小的是起点,最大的是终点

②GradientStop是成对出现的,渐变只在起点和终点之间

                    <RadialGradientBrush >
<GradientStop Color="Blue" Offset="0.1"/> <GradientStop Color="Yellow" Offset="0.6" /> <GradientStop Color="Blue" Offset="1"/> </RadialGradientBrus

上面这种写法是下面的简略,更常用

                    <RadialGradientBrush >
//
<GradientStop Color="Blue" Offset="0.1"/>

<GradientStop Color="Blue" Offset="0.1"/>
<GradientStop Color="Yellow" Offset="0.6" />

<GradientStop Color="Yellow" Offset="0.6" />
<GradientStop Color="Blue" Offset="1"/>

<GradientStop Color="Blue" Offset="1"/> </RadialGradientBrush>

填充elipse

③两个offset值相同的GradientStop,第一个是终点,向内渐变;第二个是令一组渐变的起点,向外渐变

④如果想把第一个GradientStop作为终点,因为没有与之对应的起点,所以不能形成渐变;  虽然不能渐变,但是仍然用纯色向内扩散,填满空白

把最后一个GradientStop作为起点,因为没有与之对应的终点,所以不能形成渐变;  虽然不能渐变,但是仍然用纯色向外扩散,填满余下所有空白

即【0,第一个GradientStop】、【最后一个GradientStop,1】是实心的

⑤三个offset值相同的GradientStop,第二个会被第三个覆盖掉

⑥Offset缺省值是0,

因为是渐变的特点,所以LinearGradientBrush填充Line,RadialGradientBrush填充Ellipse、Rectangle都是成立的

        <Line X1="10" Y1="10" X2="280" Y2="10" StrokeThickness="20">
<Line.Stroke>
<LinearGradientBrush>
<GradientStop Color="Yellow" Offset="0.1"/>
<GradientStop Color="Red" Offset="0.1"/>
<GradientStop Color="Blue" Offset="0.1"/> <GradientStop Color="Yellow" Offset="0.6" />
<GradientStop Color="Red" Offset="0.6"/>
<GradientStop Color="Blue" Offset="0.6" /> <GradientStop Color="Yellow" Offset="0.9"/>
<GradientStop Color="Red" Offset="0.9"/>
<GradientStop Color="Blue" Offset="0.9"/>
</LinearGradientBrush>
</Line.Stroke>
</Line>

两头都是实心的,中间的red被覆盖掉

            <Rectangle Height="140" Width="140">
<Rectangle.Fill>
<RadialGradientBrush >
<GradientStopCollection> <GradientStop Color="Yellow" Offset="0.1"/>
<GradientStop Color="Red" Offset="0.1"/>
<GradientStop Color="Blue" Offset="0.1"/> <GradientStop Color="Yellow" Offset="0.6" />
<GradientStop Color="Red" Offset="0.6"/>
<GradientStop Color="Blue" Offset="0.6" /> <GradientStop Color="Yellow" Offset="1"/>
<GradientStop Color="Red" Offset="1"/>
<GradientStop Color="Blue" Offset="1"/> </GradientStopCollection> </RadialGradientBrush>
</Rectangle.Fill>
</Rectangle>

以上例子用的都是<RadialGradientBrush >,取默认值,

相当于<RadialGradientBrush GradientOrigin="0.5,0.5" RadiusX="0.5" RadiusY="0.5">

⑦在<RadialGradientBrush GradientOrigin="0.5,0.5" RadiusX="0.5" RadiusY="0.5">的前提下

用径向笔刷填充正圆严丝合缝,而offset=1填充正方形会有相切后的4个角,用最后一个GradientStop包圆了,填充了余下所有空间

(对矩形,椭圆圆形都适用,只是特别点出这个例子)

2.渐变圆位置和大小
渐变从开始点GradientOrigin以环形(椭圆) 的方式向外辐射,RadiusX,RadiusY是渐变椭圆的r1.r2GradientOrigin的值含义,在比例坐标下,渐变椭圆的圆心。
Radiusx、Radiusy的值的含义,填充矩形时,以矩形边长(xy) 一半为标准,也就是x2y/2为标准1,渐变园的1.2; 填充圆的时候,以半径为标准1,渐变圆的

3.GradientOrigin和RadiusX,RadiusY

RadiusX=”m“,以(矩形/圆的)比例坐标的长为1个标准length,

RadiusY=”n“,以(矩形/圆的)比例坐标的宽为1个标准length,

①以(0.5,0.5)为圆心,RadiusX="m"为椭圆X轴半径,RadiusY="n"为椭圆Y轴半径画椭圆E,

②在穿过GradientOrigin这一点并垂直于椭圆所在平面的直线上选一个点S(除GradientOrigin外)

③以这个椭圆为底,点S为顶点,会形成一个斜椭圆锥

④RadialGradientBrush就是该斜椭圆锥在平面上的投影,(S点的位置只会影响体积,不会影响其在平面上的投影,所以不用纠结S点的位置)

⑤再结合GradientStop,Offset=”h“的值就是以斜椭圆椎的高为标准”1“,以顶点为线段开端0,按比例h截断斜椭圆椎,这个新的椭圆锥的地面也在平面上形成投影。

⑥另外不管GradientOrigin,RadiusX,RadiusY的值怎么变,Offset=1时,以(0.5,0.5)为圆心都不变。

以上都是改变GradientOrigin,(RadiusX=RadiusY),观察对投影的影响得出的

⑥可以通过设置 GradientOrigin,Offset=1,RadiusX,RadiusY,取0.4,0.5,0.6,再分别改变GradientOrigin的值,

点击设计页面点击矩形,xaml会显示中心点,观察中心点和GradientOrigin,Offset=1,这个圆的关系可以得出。

例一:

            <Rectangle Height="140" Width="140">
<Rectangle.Fill>
<RadialGradientBrush GradientOrigin="0,1.1" RadiusX="0.6" RadiusY="0.6">
<RadialGradientBrush.GradientStops>
<GradientStopCollection > <GradientStop Color="Yellow" Offset="0.1"/>
<GradientStop Color="Red" Offset="0.1"/>
<GradientStop Color="Blue" Offset="0.1"/> <GradientStop Color="Yellow" Offset="0.4" />
<GradientStop Color="Red" Offset="0.4"/>
<GradientStop Color="Blue" Offset="0.4" /> <GradientStop Color="Yellow" Offset="0.6" />
<GradientStop Color="Red" Offset="0.6"/>
<GradientStop Color="Blue" Offset="0.6" /> <GradientStop Color="Yellow" Offset="0.9"/>
<GradientStop Color="Red" Offset="0.9"/>
<GradientStop Color="Yellow" Offset="1"/>
<GradientStop Color="Blue" Offset="1"/> </GradientStopCollection> </RadialGradientBrush.GradientStops> </RadialGradientBrush>
</Rectangle.Fill>
</Rectangle>

例二

 <Ellipse Height="140" Width="140">
<Ellipse.Fill>
<RadialGradientBrush GradientOrigin="1.1,0" RadiusX="0.3" RadiusY="0.3" >
<GradientStop Color="Purple" Offset="0.1"/> <GradientStop Color="Yellow" Offset="0.6" />
<GradientStop Color="green" Offset="0.6" /> <GradientStop Color="Blue" Offset="1" />
<GradientStop Color="Black" Offset="1" /> </RadialGradientBrush>
</Ellipse.Fill>
</Ellipse>

二、RotateTransform变换

CenterX="0.5" CenterY="0",取值依然选取比例坐标系

以 CenterX="0.5" CenterY="0"为圆心,将图形顺时针旋转Angle="90"。

三、《深入浅出WPF》P251用径向画刷填充椭圆

为了便于观察,颜色选取鲜艳颜色,并在Offset="0.66" 设置两个GradientStop。

 <Ellipse Stroke="Blue" Width="140" Height="140" Cursor="Hand" ToolTip="A Ball">
<Ellipse.Fill>
<RadialGradientBrush GradientOrigin="0.2,0.8" RadiusX="0.75" RadiusY="0.75">
<RadialGradientBrush.RelativeTransform>
<TransformGroup>
<RotateTransform Angle="90" CenterX="0.5" CenterY="0.5"/> </TransformGroup>
</RadialGradientBrush.RelativeTransform>
<GradientStop Color="#FFFFFFFF" Offset="0"/>
<GradientStop Color="#FF444444" Offset="0.66"/>
<GradientStop Color="Red" Offset="0.66"/>
<GradientStop Color="Yellow" Offset="1"/>
</RadialGradientBrush>
</Ellipse.Fill>
</Ellipse>

在这个例子里有意思的是 RadiusX="0.75" RadiusY="0.75"和Offset="0.66" 这两个值

圆的外切矩形的外接圆的半径是圆直径的√2/2,约等于0.7

而0.75×0.66=0.495≈0.5,也就是说Offset="0.66"时,截取的斜圆锥底面在平面上的投影与要填充的elipse大小基本一致。

这是球体的光影效果逼真的原因

P251——用RadialGradientBrush填充椭圆,并进行RotateTransform变换的更多相关文章

  1. c++ builder firemonkey 实现填充椭圆

    相信同类Delphi 类似文章非常多了,这里我用c++ builder firemonkey 实现填充椭圆 本例主要在FormPaint实现,当然你想在Image1->Bitmap->Ca ...

  2. GDI+绘制图形和画刷填充图形

    GDI+可以再Windows窗体应用程序中以编程方式绘制图形等. 可以在VS里新建项目-Windows窗体应用程序-建一个窗体.首先引入命名空间using System.Drawing.Imaging ...

  3. Silverlight & Blend动画设计系列六:动画技巧(Animation Techniques)之对象与路径转化、波感特效

    当我们在进行Silverlight & Blend进行动画设计的过程中,可能需要设计出很多效果不一的图形图像出来作为动画的基本组成元素.然而在设计过程中可能会出现许多的问题,比如当前绘制了一个 ...

  4. GDI+ 笔记

    1.GDI+模板 #include<windows.h> #include<GdiPlus.h> #include <time.h> #include <ma ...

  5. C# Graphics类详解

    转自于:http://blog.163.com/gis_warrior/blog/static/19361717320119227034181/ Brush 类.NET Framework 4定义用于 ...

  6. 准备.Net转前端开发-WPF界面框架那些事,UI快速实现法

    题外话 打开博客园,查看首页左栏的”推荐博客”,排名前五的博客分别是(此处非广告):Artech.小坦克.圣殿骑士.腾飞(Jesse).数据之巅.再看看它们博客的最新更新时间:Artech(2014- ...

  7. {Reship}{C#}{GDI+}GDI+画笔,线,区域类型

    =================================================================================== This article is ...

  8. Silverlight形状、画笔、变换、图像处理、几何图形

    1.形状(Ellipse.Line.Path.Polygon.Polyline 和 Rectangle) <UserControl x:Class="SharpStudy.MainPa ...

  9. winform异型不规则界面设计

    一,不规则WINFORM窗体 Author:unknown From:Internet在以前版本的Visual Basic或Visual C++中,创建不规则窗体和控件是一件很复杂的事,不仅需要调用大 ...

  10. GDI+编程的10个基本技巧(转)

    创建绘图表面 创建绘图表面有两种常用的方法.下面设法得到PictureBox的绘图表面. private void Form1_Load(object sender, System.EventArgs ...

随机推荐

  1. 从 pheatmap 无缝迁移至 ComplexHeatmap

    pheatmap 是一个非常受欢迎的绘制热图的 R 包.ComplexHeatmap 包即是受之启发而来.你可以发现Heatmap()函数中很多参数都与pheatmap()相同.在 pheatmap  ...

  2. 深度学习应用篇-推荐系统[12]:经典模型-DeepFM模型、DSSM模型召回排序策略以及和其他模型对比

    深度学习应用篇-推荐系统[12]:经典模型-DeepFM模型.DSSM模型召回排序策略以及和其他模型对比 1.DeepFM模型 1.1.模型简介 CTR预估是目前推荐系统的核心技术,其目标是预估用户点 ...

  3. Supervisor启动并管理Celery相关进程

    Supervisor启动并管理Celery相关进程 关于celery在运行过程中, 默认情况下是无法在关机以后自动重启的.所以我们一般开发中会使用supervisor进程监控来对celery程序进行运 ...

  4. SpringBoot+MyBatisPlus实现读写分离

    前言 随着业务量的不断增长,数据库的读写压力也越来越大.为了解决这个问题,我们可以采用读写分离的方案来分担数据库的读写负载.本文将介绍如何使用 Spring Boot + MyBatis Plus + ...

  5. Pinot2的无人机任务和数据处理实践

    目录 1. 引言 2. 技术原理及概念 2.1 基本概念解释 2.2 技术原理介绍 2.3 相关技术比较 3. 实现步骤与流程 4. 应用示例与代码实现讲解 4.1 应用场景介绍 4.2 应用实例分析 ...

  6. 记一次Native memory leak排查过程

    1 问题现象 路由计算服务是路由系统的核心服务,负责运单路由计划的计算以及实操与计划的匹配.在运维过程中,发现在长期不重启的情况下,有TP99缓慢爬坡的现象.此外,在每周例行调度的试算过程中,能明显看 ...

  7. 力扣 662 https://leetcode.cn/problems/maximum-width-of-binary-tree/

    需要了解树的顺序存储 如果是普通的二叉树 ,底层是用链表去连接的 如果是满二叉树,底层用的是数组去放的,而数组放的时候 会有索引对应 当前父节点是索引i,下一个左右节点就是2i,2i+1 利用满二叉树 ...

  8. Dubbo的高级特性:服务治理篇

    王有志,一个分享硬核Java技术的互金摸鱼侠 加入Java人的提桶跑路群:共同富裕的Java人 上一篇中,我们已经在Spring Boot应用中集成了Dubbo,并注册了一个服务提供方和一个服务使用方 ...

  9. 如何给Github上的开源项目提交PR?

    前言 对于一个热爱开源的程序员而言,学会给GitHub上的开源项目提交PR这是迈出开源的第一步.今天我们就来说说如何向GitHub的开源项目提交PR,当然你提交的PR可以是一个项目的需求迭代.也可以是 ...

  10. postgresql + timescaledb离线安装笔记(zabbix数据库准备工作)

    实验环境 操作系统:centos 7.6 PostgreSQL:14.6 timescaledb:2.8.1 网络:本地无网络 1 编译源码安装 1.1 准备工作 useradd postgres m ...