案例2-直线中点Bresenham算法
中点bresenham算法过程
中点Bresenham算法是一种用于计算在直线上的格点的算法。它是由Bresenham在1965年提出的,是一种高效的计算机图形学算法,通常用于直线、圆、椭圆等形状的绘制。通过这篇文章,我们将详细介绍中点Bresenham算法的过程。
1. 背景知识
在计算机图形学中,我们经常需要在屏幕上绘制直线、圆、椭圆等形状。而计算机屏幕上的图像是由像素组成的,因此我们需要一种算法来计算出这些形状上的像素坐标,从而进行绘制。中点Bresenham算法就是用来解决这个问题的。
2. 中点Bresenham算法的原理
中点Bresenham算法的原理是通过巧妙的数学推导,找到离直线最近的像素点,从而确定需要绘制的像素坐标。该算法通过利用误差项来判断下一个像素点的位置,具有高效、简洁的特点。
3. 中点Bresenham算法的过程
中点Bresenham算法的过程可以分为以下几个步骤:
3.1 初始化变量:首先需要确定直线的起点和终点,并初始化相关变量,如起点坐标(x0, y0)、终点坐标(x1, y1)、误差项d和增量变化量dx、dy等。
3.2 计算斜率k和误差项初始值:通过计算直线的斜率k,并根据斜率确定误差项的初始值。
3.3 循环计算像素点的坐标:根据误差项的大小,确定下一个像素点的位置,并更新误差项的值,直到绘制完整条直线。
4. 中点Bresenham算法的优势
* 算法简洁高效:中点Bresenham算法通过简单的数学计算,即可确定直线上的像素坐标,避免了直接计算斜率导致的浮点数运算,因此在计算速度上具有较大优势。
图形学--(中点画线法+Bresenham画线算法)
19
}else{
20
21
d0+=d1;
22
}
23
24 }
25 }
26 //Bresenham画线算法
27 void line2(int x1,int y1,int x2,int y2){
28
29 int x,y,dx,dy,d;
30 y=y1;
31 dx=x2-x1;
32 dy=y2-y1;
33 d=2*dy-dx;
这俩种算法都是用来在计算机上画一条直线的那么我们为什么不直接用直线方程分别带点再打亮呢这是因为计算机中每个坐标点都是整数而直线是由一个个像素点组合而成的那么直接将坐标点再进行四舍五入整数化就好了啊的确这是一种方法但计算机中进行浮点数的四舍五入会使运算效率变差因此真正画直线时是用到上边这俩种方法的
图形学 --(中点画线法 +Bresenham画线算法)
//增量d的初始值
34 for(x=x1;x<=x2;x++){
35 putpixel(x,y,GREEN); //打亮
36 if(d<0){
37
d+=2*dy;
38 }else{
39 y++;
40 d+=2*dy-2*dx;
41 }
42
43
直线中点Bresenham算法实验报告
附页:
一实验分析
要求和算法如上表格所示
二核心算法
1.CTestView.h文件
// TestView.h : interface of the CTestView class
/////////////////////////////////////////////////////////////////////////////
#if !defined(AFX_TESTVIEW_H__A75FDCFB_621C_4E38_A154_C344803E6372__INCLUDED_) #define AFX_TESTVIEW_H__A75FDCFB_621C_4E38_A154_C344803E6372__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "InputDlg.h"//对话框头文件
class CTestView : public CView
{
protected: // create from serialization only
CTestView();
DECLARE_DYNCREA TE(CTestView)
// Attributes
public:
CTestDoc* GetDocument();
// Operations
public:
void Mbline();//直线中点Bresenham函数
// Overrides
// ClassWizard generated virtual function overrides
Bresenham直线算法
nidGIS专业实验报告(计算机图形学)
实验.1 使用Bresenham画线算法,绘制一条直线段
一.
根据Bresenham画线算法,掌握绘制直线的程序设计方法。注意,不能使用语言库中的画线函数。
二.理论基础
1.中点Bresenham算法:
在屏幕上建立平面直角坐标系,根据所给的坐标得出数学意义上的直线公式,然后在最大位移方向上依次选取最逼近直线的像素点,最终取所有像素点,得到的像素点尽可能的逼近直线,并填充颜色,显示出来。
三.算法设计与分析
源码如下:
#include
#include
#include
void init(void)
{
glClearColor(0.0,0.0,0.0,0.0);
gluOrtho2D(0.0,50.0,.0,40.0);
}
int abs(int x)
{
int y;
if(x<=0)
y=-x;
else
y=x;
return y;
}
void set_pixel(float x,float y)
{
glPointSize(10);
glBegin(GL_POINTS);
glVertex2f(x,y);
glEnd();
}
void voidline(int x1,int y1,int x2,int y2)
{
int dx;
int dy;
int x;
int y;
int p;
int const1;
int const2;
int inc;
int tmp;
dx=x2-x1;
dy=y2-y1;
if(dx*dy>=0)
inc=1;
else
inc=-1;
if(abs(dx)>abs(dy))
{
if(dx<0)
计算机图形学实验报告--Bresenham直线算法与画圆算法
实验一名称:基本图形的生成算法
要求:(1)掌握DDA生成线段算法
(2)掌握Bresenham生成线段算法
(3)掌握生成圆弧算法
1.代码
(1) Bresenham画线算法
void CDlgBresenhamLine::OnBresenhamBUTTON2()
{
UpdateData(true);
CDC* pDC=m_picture.GetDC();
int xa=m_start_x, ya=m_start_y, xb=m_end_x,
yb=m_end_y,c=RGB(0,255,0);
int dx=abs(xa-xb),dy=abs(ya-yb);
int p=2*dy-dx;
int x,y;
if(xa>xb){
x=xb;
y=yb;
xb=xa;
}
else{
x=xa;
y=ya;
}
while(x<xb){
x++;
if(p<0)
p+=2*dy;
else{
y++;
p+=2*(dy-dx);
}
pDC->SetPixel((int)x, (int)y, c);
}
ReleaseDC(pDC);
}
(2)中点画圆算法
void CDMidpointcircleDlg::OncircleBUTTON2()
{
// TODO: Add your control notification handler code here UpdateData(true);
CDC* pDC=m_picture.GetDC();
int xc=m_x, yc=m_y, r=m_r, c=RGB(255,0,0);
python语言实现的bresenham算法
python语言实现的bresenham算法Bresenham算法是一种用于绘制直线的经典算法,它能够有效地计算出直线上的像素点,减少了计算与绘制的开销。本文将逐步介绍如何使用Python语言实现Bresenham算法。
第一步,我们需了解Bresenham算法的原理及其背后的数学思想。该算法基于直线的一般方程y = mx + b,其中m为斜率,b为y轴截距。Bresenham算法的核心在于决策,即在每一个像素点处,选择最合适的下一个像素点。其思想是,在给定的直线段中,比较由当前像素点到两个候选像素点的斜率值,从而决定下一步绘制的方向。利用整数计算,避免了实数运算,提高了运行效率。
接下来,我们将使用Python语言实现Bresenham算法。首先,需要引入必要的图形库,如matplotlib或者pygame。这些库能够帮助我们在屏幕上绘制图形。以matplotlib为例,我们首先需要创建一个画布,并在画布上绘制直线。代码如下:
python
import matplotlib.pyplot as plt
# 创建画布
fig, ax = plt.subplots()
# 绘制直线
def bresenham(x1, y1, x2, y2): dx = abs(x2 - x1)
dy = abs(y2 - y1)
if x1 < x2:
sx = 1
else:
sx = -1
if y1 < y2:
sy = 1
else:
sy = -1
err = dx - dy
while True:
ax.plot(x1, y1, 'bo')
中点bresenham算法斜率大于1例题
随着计算机图形学的发展,Bresenham算法作为一种高效的直线扫描算法被广泛应用。本文将结合中点Bresenham算法和斜率大于1的具体例题,深入探讨其原理及应用。
1. 中点Bresenham算法
中点Bresenham算法是一种用于绘制直线的算法,其特点是高效、精确。该算法通过在每个x处选择最接近直线的y坐标,从而实现了高效的直线绘制。中点Bresenham算法的原理可用以下步骤描述:
1)假设直线连接点A(x0, y0)和点B(x1, y1)。
2)计算直线斜率m = (y1-y0)/(x1-x0)。
3)设置初始值x=x0, y=y0。
4)计算决策参数P0 = 2*(y1-y0) - (x1-x0)。
5)循环执行以下步骤直至x达到x1:
a) 如果P0<0,则选择点(x+1, y),即决策参数P0 = P0 + 2*(y1-y0)。
b) 如果P0>=0,则选择点(x+1, y+1),即决策参数P0 = P0 + 2*(y1-y0) - 2*(x1-x0)。
2. 斜率大于1的例题
假设有一条直线连接点A(2, 5)和点B(7, 10),斜率m = (10-5)/(7-2) = 1。我们可以通过中点Bresenham算法来绘制这条直线,具体步骤
如下:
1)设定初始值 x=2, y=5;
2)计算初始的决策参数P0 = 2*(10-5) - (7-2) = 10;
3)根据决策参数P0的值来确定下一个点的位置:
a) 当P0<0时,选择点(3, 5),更新P0 = P0 + 10 = 20;
中点bresenham算法过程描述
中点Bresenham算法是一种在计算机图形学中用于绘制直线的算法。它是由Bresenham在1965年提出的,经过研究和改良后,成为一种非常高效的直线绘制算法。
1. 算法描述
中点Bresenham算法的基本思想是利用线的对称性来进行计算,通过计算线上的各个像素点与理想直线的距离来确定下一个要绘制的像素点,从而高效地绘制直线。
2. 算法过程
具体来说,中点Bresenham算法的计算过程如下:
1) 首先确定直线的起点(x0, y0)和终点(x1, y1),并计算直线的斜率k = (y1 - y0) / (x1 - x0)。
2) 然后计算直线的斜率误差delta = |k| - 0.5。
3) 初始化绘制像素点的坐标(x, y),初始误差值为0。
4) 对于直线斜率绝对值小于1的情况:
a) 如果斜率k大于0,则初始误差值为0.5,否则为-0.5。
b) 从x0到x1的范围内,依次计算每个像素点的y坐标,并根据误差值确定下一个像素点的位置,并更新误差值。
c) 如果误差值大于0,表示下一个像素点在直线的下边,否则在上边。
5) 对于直线斜率绝对值大于1的情况,可以通过将直线绘制区域进
行旋转并交换x和y坐标来处理。
6) 最终绘制直线时,可以根据具体的应用场景选择存储像素点的方式,比如直接在屏幕上绘制,或者存储在像素数组中后再一次性绘制等。
3. 算法优势
中点Bresenham算法相对于其他直线绘制算法的优势在于:它避免了复杂的浮点数计算,减少了计算量,提高了绘制的效率。尤其在早期
计算机硬件性能有限的情况下,该算法表现出了明显的优势,成为了
bresenham算法画直线例题
Bresenham算法是计算机图形学中常用的一种画直线的算法。它的原理是利用像素点在屏幕上的排列规律,从而高效地计算出直线上的像
素点。本文将以一个具体的例题来说明Bresenham算法的原理及应用。
1. 问题描述
假设我们需要在一个分辨率为800x600的屏幕上,画一条直线,起点坐标为(100, 200),终点坐标为(400, 300)。请使用Bresenham算法
计算直线上的像素点,并用符号“*”表示出来。
2. Bresenham算法原理
Bresenham算法的核心思想是利用像素点的整数坐标值与直线的斜率之间的关系,从而逐个确定直线上的像素点。
具体步骤如下:
- 计算直线的斜率k,即k = (y2 - y1) / (x2 - x1),其中(x1, y1)为起
点坐标,(x2, y2)为终点坐标。
- 以起点坐标作为初始值,从左至右依次求解直线上各点像素的坐标。- 对于每一个x坐标,根据斜率k的大小确定y坐标的增长方向。
3. Bresenham算法应用
根据上述原理,我们来解决具体的例题。
计算直线的斜率k:
k = (300 - 200) / (400 - 100) = 1/3
以起点坐标(100, 200)作为初始值,从左至右依次求解直线上各点像素的坐标。
当x坐标从100递增至400时,y坐标的增长方向由斜率k来确定。具体计算如下:
- 当x=100时,y=200
- 当x=101时,y=200+1/3≈200
- 当x=102时,y=200+2/3≈201
- ...
- 当x=400时,y=300
现在,我们可以得到直线上的像素点坐标,并用符号“*”表示出来。
计算机图形学实验Bresenham算法
{
x++;
d-=1+k;
}
else
d-=1;
}
}
if(-1<=k && k<0)
{
if(x0>x1)
{
double tx=x0;
double ty=y0;
x0=x1;y0=y1;
x1=tx;
y1=ty;
}
x=x0;y=y0;
d=-0.5-k;
for(x=x0;x<=x1;x++)
{
dc.SetPixel(ROUND(x),ROUND(y),rgb);
使用对话框输入直线的起点和终点坐标试以屏幕中心为二维坐标系原点绘制任意斜率的直线段
实验一1-3
一、实验题目
将中点Bresenham算法推广到绘制任意斜率的直线段。使用对话框输入直线的起点和终点坐标,试以屏幕中心为二维坐标系原点,绘制任意斜率的直线段。要求编制CLine类,成员函数为MoveTo()和LineTo()。对边界像素的处理原则是“起点闭区间、终点开区间”,即要求所绘直线达到VC++的MoveTo()和LineTo()函数的绘制效果。
}
else
d+=1;
}
}
if(k<-1)
{
直线的中点Bresenham算法
Th e e e Br s nha l o ihm fCen e nto r i htLi m A g rt o t r Poi fSt a g ne
W A N G ng Fa ,W AN G e g—ln Zh n a
( n n n ig Istt f gn e rs Xuh u2 1 0 , ia Co u a dn nt ueo ie rCop , z o 2 0 4 Chn ) i En
其 中 :k= k1y+ k X+ x+ ,k=y+1 l l 这 两 个分 离 点 的差 分 为 :
d- 22 K 1 2 k2 - jd= m x+ ) y b l - + 如 果 d d , 么 Y 处 的像 素 比 Y+ 的像 素 更 接 近 于线 段 , 时选 择 较 像 素 。 那 < k K 】 此
(k,k, X+y) 反之 d> 2那 么 Y 处 的像 素 比 Y l ld , ㈧ 的像 素 更 接 近 于线 段 , 时 选 择 较 高 此
图 I 像 素 位 置 到 取 样 位 置 X 处 线段 上 v坐
标 之 间的 距 离
像 素 x 1 ) ,+。 k Y 1 十 K
d 来 标 识 两 个 候选 像 素 与线 段 数 学 路 径 的 垂 直 偏移 .
那 么 . 个 候 选 像 素 与 线段 数学 路 径 的垂 直 偏 移 分 别 为 : 两
布雷森汉姆直线算法
布雷森汉姆直线算法
布雷森汉姆直线算法(Bresenham's Line Algorithm)是一种计
算机图形学中常用的直线绘制算法,其通过在离散的像素格上选择最
接近实际直线路径的点来实现高效绘制直线的目的。该算法由Jack Elton Bresenham在1962年首次提出,被广泛应用于图形显示、打印
机及数码扫描仪等领域。
布雷森汉姆直线算法的核心思想是利用整数运算来代替浮点运算,从而提高计算效率。该算法通过仅使用加法、减法和位移等基本运算,不需要乘法运算和浮点数运算,从而适用于资源有限的嵌入式系统和
低成本的图形设备。
算法的基本步骤如下:
1. 根据起点P1(x1,y1)和终点P2(x2,y2)确定直线斜率k。
2. 如果|k|≤1,则沿x轴方向递增遍历起点P1到终点P2,并在
每个像素上绘制。
若k>1,则沿y轴方向递增遍历P1到P2,绘制每个像素。
3. 对于每一步,根据递增的方向选择相应的像素。
4. 根据斜率k来决定误差累积量,调整绘制位置,保证直线的连
续性。
该算法的优势在于其简单而高效的原理,使得绘制直线的速度非
常快。与传统的基于浮点运算的算法相比,布雷森汉姆直线算法的计
算开销较小,而且能够得到非常接近实际直线路径的结果,几乎没有
明显的视觉差异。这使得该算法在计算资源有限的场景下非常有用,
例如在嵌入式系统中,可以利用该算法绘制图形界面的边界、线条等。
然而,布雷森汉姆直线算法也存在一些局限性。由于只考虑了整
数坐标,因此绘制出来的直线可能会有些锯齿状,这在一些高精度要
求的场景下可能会表现出明显的视觉噪点。此外,该算法仅适用于绘
直线的Bresenham算法
直线的Bresenham算法
在实验课上⽤⾃⼰的算法画直线被diss效率低
花了半天时间看了下Bresenham算法真
总结⼀下其中的精妙之处
Bresebham直线⽣成算法的基本原理是,每次在最⼤位移⽅向上⾛⼀步,⽽另⼀个⽅向是⾛步还是不⾛步取决于误差项的判别。声明k为斜率
在0≤k<1的情况下,假设当前点是P(x1,y1),则下⼀个点在P u(x1+1,y1+1)与P d(x1+1,y1)中选⼀。
以M表⽰P u与P d的中点,即M(x1+1,y1+0.5)。设Q是理想直线与x=x i+1的交点;
显然,若M在Q的下⽅,则P u(x1+1,y1+1)离直线较近,应取为下⼀个像素;否则应取P d(x1+1,y1)。
理解并不难主要在于实现
依据该算法的原理基本能够实现
窝先试着⾃⼰写了⼀会
如果要实现各个⽅向的⼆维直线绘制
需要考虑多种情况写出来很不美观
教材上给出了更好的解决⽅案:
同样以0≤k<1为例
每次选取下个点时理想直线的y坐标都步进k个单位长度
累加值即为误差项d i
当d i⼤于0.5时选取P u否则选取P d并使d i-1
令e i=d i-0.5
则e i>0时选取P u否则选取P d
经过改进,算法的效率⼤幅提升
但其中在计算斜率与误差项时会⽤到⼩数和除法
并且下⼀步的选择只与误差项的符号有关
因此可以进⼀步改进:
可知e i的值由三种值组成:e i=-1/2(初始值)+(n个)y/x(步进值)-(m个)1(调整值)...
同乘2x即得2*x*e i=-x+(n个)2*y-(m个)2*x....
(推荐下载)bresenham算法例题分析
(完整word版)bresenham算法例题分析
编辑整理:
尊敬的读者朋友们:
这里是精品文档编辑中心,本文档内容是由我和我的同事精心编辑整理后发布的,发布之前我们对文中内容进行仔细校对,但是难免会有疏漏的地方,但是任然希望((完整word 版)bresenham算法例题分析)的内容能够给您的工作和学习带来便利。同时也真诚的希望收到您的建议和反馈,这将是我们进步的源泉,前进的动力。
本文可编辑可修改,如果觉得对您有帮助请收藏以便随时查阅,最后祝您生活愉快业绩进步,以下为(完整word版)bresenham算法例题分析的全部内容。
1、利用Bresenham算法扫描转换连接两点P0(1,1)和P1(6,4)的直线段。(共10分)
(1)根据题意可写出如下Bresenham算法。请将将下面程序补充完整:(2分)Bresenham_Line (int x0,int y0,int x1, int y1,int color)
{
int dx,dy,p,i,x,y,const1,const2;
dx = x1—x0, dy = y1- y0, p=2*dy—dx;
const1=2*dy;
const2=2*(dy—dx);
x=x0, y=y0;
putpixel (x, y, color);
while(x<x1)
{
x++;
if (p〈0)
;
else
{
y++;
;
}
putpixel(x,y,color);
}
}
(2)对给定的线段进行扫描转换,要求写出算法执行过程中数据的变化.(6分)
(3)在给定的坐标中绘制出算法执行结果。(2分)
中点bresenham算法的基本原理与递推公式
中点Bresenham算法是一种用于绘制直线的光栅化算法,它可以在计算机图形学中高效地绘制直线,尤其适用于嵌入式系统和低性能设备。本文将介绍中点Bresenham算法的基本原理和递推公式。
一、中点Bresenham算法的基本原理
1.1 数值方式直线的差值算法
在了解中点Bresenham算法之前,我们需要先了解数值方式直线的差值算法。通过计算两个端点的坐标差值,可以得到直线的斜率和步长,从而在光栅化的像素网格上绘制直线。然而,这种算法需要进行浮点
数运算,对于嵌入式系统和低性能设备来说,性能较差。
1.2 中点Bresenham算法的优势
中点Bresenham算法通过整数运算和递推公式来高效地绘制直线,避免了浮点数运算的开销,因此在嵌入式系统和低性能设备上具有很高
的应用价值。它利用了直线的对称性和整数坐标的特点,通过逐个像
素的递推计算来实现直线的绘制。
1.3 算法的基本思想
中点Bresenham算法的基本思想是从直线的起点到终点,在每一步选择最接近直线的像素作为下一个像素,从而逐步绘制整条直线。通过
比较像素的位置和理想直线的位置关系,选择最接近直线的像素进行
绘制,从而得到了中点Bresenham算法的递推过程。
二、中点Bresenham算法的递推公式
2.1 直线斜率的计算
我们需要计算直线的斜率m。对于给定的两个端点P1(x1, y1)和
P2(x2, y2),直线的斜率可以通过以下公式计算得到:
m = (y2 - y1) / (x2 - x1)
2.2 中点Bresenham算法的关键递推公式
中点bresenham算法
中点bresenham算法
中点bresenham算法原理
由Bresenham提出的直线生成算法的基本原理是,每次在最大位移方向上走一步,而另一个方向是走步还是不走步取决于误差项的判别。
这时直线将平面分成三个区域:对于直线上的点,F(x,y)=0;对于直线上方的点,F(x,y)>0;对于直线下方的点,F(x,y)<0。
首先假设0≤k≤1,由于x是最大位移方向,因此每次在x方向上加1,y方向上或加1 或加0。假定当前点是P(xi,yi),则下一个点在pu(xi+1,yi+1)与pd(xi+1,yi)中选一。以M表示pu和pd的终点即M(xi+1,yi+0.5)。又设Q是理想直线与垂直线x=xi+1的交点。显然,若M在Q 的下方,则pu(xi+1,yi+1)离直线近,应取为下一个像素,否则应取Pd(xi+1,yi)。
所以如前所述,欲判断Q在M的上方还是下方,只要把M代入F(x,y),并判断它的符号即可。
如上构造判别式,当di<0时,M在直线下方,故应取Pu。当di>0时,应取正右方的Pd。当di=0时,
两者一样合适,可以随便取一个。
所以现在根据上面的判别式对误差项进行递推。
当di<0时,取右上方像素Pu,欲判断再下一个像素应该取那个应计算
此时di的增量为1-k。
当di≥0时,取右上方像素Pd,欲判断再下一个像素应该取那个应计算
下面进行di的初值计算。显然直线的第一个像素P(x0,y0)在直线上,因此响应的di的初始值计算如下
但是这其中仍然有小数,由于我们使用的只是di的符号,因此可以用2di△x摆脱小数
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程实验报告
步骤
为了规范颜色的处事,定义了CRGB类,重载了“+”,“-”、“*”、“\”、“+=”、“-=”、“*=”、“/=”运算符。成员函数Normalize()将颜色分量red,green,blue规范到[0,1]闭区间内。
RGB.h
#pragma once
class CRGB
{
public:
CRGB();
CRGB(double, double, double);
~CRGB();
friend CRGB operator + (const CRGB&, const CRGB&);
friend CRGB operator - (const CRGB&, const CRGB&);
friend CRGB operator * (const CRGB&, const CRGB&);
friend CRGB operator * (const CRGB&, double);
friend CRGB operator * (double, const CRGB&);
friend CRGB operator / (const CRGB&, double);
friend CRGB operator += (const CRGB&, const CRGB&);
friend CRGB operator -= (const CRGB&, const CRGB&);
friend CRGB operator *= (const CRGB&, const CRGB&);
friend CRGB operator /= (const CRGB&, double);
void Normalize();
public:
double red;
double green;
double blue;
};
RGB.cpp
#include"stdafx.h"
#include"RGB.h"
CRGB::CRGB()
{
red = 1.0;
green = 1.0;
blue = 1.0;
}
CRGB::~CRGB()
{}
CRGB::CRGB(double r, double g, double b)
{
red = r;
green = g;
blue = b;
}
CRGB operator +(const CRGB &c1, const CRGB &c2) {
CRGB c;
c.red = c1.red + c2.red;
c.green = c1.green + c2.green;
c.blue = c1.blue + c2.blue;
return c;
}
CRGB operator - (const CRGB &c1, const CRGB &c2) {
CRGB c;
c.red = c1.red - c2.red;
c.green = c1.green - c2.green;
c.blue = c1.blue - c2.blue;
return c;
}
CRGB operator * (const CRGB&c1, const CRGB&c2) {
CRGB c;
c.red = c1.red * c2.red;
c.green = c1.green * c2.green;
c.blue = c1.blue * c2.blue;
return c;
}
CRGB operator * (const CRGB&c1, double k)
{
CRGB c;
c.red = c1.red*k;
c.green = c1.green*k;
c.blue = c1.blue*k;
return c;
}
CRGB operator * (double k, const CRGB&c1)
{
CRGB c;
c.red = c1.red*k;
c.green = c1.green*k;
c.blue = c1.blue*k;
return c;
}
CRGB operator / (double k, const CRGB&c1)
{
CRGB c;
c.red = c1.red / k;
c.green = c1.green / k;
c.blue = c1.blue / k;
return c;
}
CRGB operator +=(const CRGB &c1, const CRGB &c2) {
CRGB c;
c.red = c1.red + c2.red;
c.green = c1.green + c2.green;
c.blue = c1.blue + c2.blue;
return c;
}
CRGB operator -= (const CRGB &c1, const CRGB &c2) {
CRGB c;
c.red = c1.red - c2.red;
c.green = c1.green - c2.green;
c.blue = c1.blue - c2.blue;
return c;
}
CRGB operator *= (const CRGB&c1, const CRGB&c2) {
CRGB c;
c.red = c1.red * c2.red;