前两天在网上看了些相似的文章,自已学着写了一个,下面是示例,再下面是代码:

在代码中显示工具提示的时候(在下图中应该有个鼠标指针,但没截出来)用到了不规则形状的命中测试,我使用了GraphicsPath类的实例方法IsVisible,不知道有没有更好的方法?期待牛人解答:

using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Linq; using System.Text; using System.Windows.Forms; using System.Runtime.InteropServices; using System.Runtime.Serialization; using System.Collections; using System.Drawing.Drawing2D; namespace Etonesoft.Controls.Charts { public partial class Pie3D : UserControl { #region PieHeight 属性定义 /// <summary> /// 当PieHeight属性更改时发生。 /// </summary> public event EventHandler PieHeightChanged; /// <summary> /// 引发按控件的PieHeight属性。 /// </summary> /// <param name="e">包含事件所需要数据的事件参数对象。</param> protected virtual void OnPieHeightChanged(EventArgs e) { this.Refresh(); //如果控件的PieHeightChanged事件不为空且委托链长度大于0,则引发该事件。 if (PieHeightChanged != null && PieHeightChanged.GetInvocationList().Length > 0) { PieHeightChanged(this, e); } } private int m_PieHeight = 40; /// <summary> /// 获取或设置饼图的高度。 /// </summary> [Category("扩展")] [Browsable(true)] [DefaultValue(typeof(int), "40")] [Description("获取或设置饼图的高度。")] public int PieHeight { get { return m_PieHeight; } set { if (m_PieHeight == value) return; m_PieHeight = value; OnPieHeightChanged(new EventArgs()); } } #endregion #region SliceMargin 属性定义 /// <summary> /// 当SliceMargin属性更改时发生。 /// </summary> public event EventHandler SliceMarginChanged; /// <summary> /// 引发按控件的SliceMargin属性。 /// </summary> /// <param name="e">包含事件所需要数据的事件参数对象。</param> protected virtual void OnSliceMarginChanged(EventArgs e) { this.Refresh(); //如果控件的SliceMarginChanged事件不为空且委托链长度大于0,则引发该事件。 if (SliceMarginChanged != null && SliceMarginChanged.GetInvocationList().Length > 0) { SliceMarginChanged(this, e); } } private int m_SliceMargin = 10; /// <summary> /// 获取或设置各饼块的间距。 /// </summary> [Category("扩展")] [Browsable(true)] [DefaultValue(typeof(int), "10")] [Description("获取或设置各饼块的间距。")] public int SliceMargin { get { return m_SliceMargin; } set { if (m_SliceMargin == value) return; m_SliceMargin = value; OnSliceMarginChanged(new EventArgs()); } } #endregion #region GradientRate 属性定义 /// <summary> /// 当GradientRate属性更改时发生。 /// </summary> public event EventHandler GradientRateChanged; /// <summary> /// 引发按控件的GradientRate属性。 /// </summary> /// <param name="e">包含事件所需要数据的事件参数对象。</param> protected virtual void OnGradientRateChanged(EventArgs e) { this.Refresh(); //如果控件的GradientRateChanged事件不为空且委托链长度大于0,则引发该事件。 if (GradientRateChanged != null && GradientRateChanged.GetInvocationList().Length > 0) { GradientRateChanged(this, e); } } private int m_GradientRate = 80; /// <summary> /// 获取或设置各饼块的透明度。 /// </summary> [Category("扩展")] [Browsable(true)] [DefaultValue(typeof(int), "80")] [Description("获取或设置各饼块的透明度。")] public int GradientRate { get { return m_GradientRate; } set { if (m_GradientRate == value) return; if (value<0 || value>100) { throw new ArgumentOutOfRangeException("value", "颜色的透明度大小0且小于等于100"); } m_GradientRate = value; OnGradientRateChanged(new EventArgs()); } } #endregion #region CircumgyRate 属性定义 /// <summary> /// 当CircumgyRate属性更改时发生。 /// </summary> public event EventHandler CircumgyRateChanged; /// <summary> /// 引发按控件的CircumgyRate属性。 /// </summary> /// <param name="e">包含事件所需要数据的事件参数对象。</param> protected virtual void OnCircumgyRateChanged(EventArgs e) { this.Refresh(); //如果控件的CircumgyRateChanged事件不为空且委托链长度大于0,则引发该事件。 if (CircumgyRateChanged != null && CircumgyRateChanged.GetInvocationList().Length > 0) { CircumgyRateChanged(this, e); } } private float m_CircumgyRate = 0f; /// <summary> /// 获取或设置控件在绘制时初始旋转角度。 /// </summary> [Category("扩展")] [Browsable(true)] [DefaultValue(typeof(float), "0")] [Description("获取或设置控件在绘制时初始旋转角度。")] public float CircumgyRate { get { return m_CircumgyRate; } set { if (m_CircumgyRate == value) return; m_CircumgyRate = value % 360; OnCircumgyRateChanged(new EventArgs()); } } #endregion PieSlices m_PieSlices; /// <summary> /// 获取控件当前的饼块列表 /// </summary> [Description("获取控件当前的饼块列表")] [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] public PieSlices PieSlices { get { return m_PieSlices; } } protected Rectangle PieRectangle { get { Rectangle rect = this.DisplayRectangle; if (rect.IsEmpty) return rect; int min = Math.Min(rect.Width / 2, rect.Height - PieHeight); int y = (min - rect.Height) / 2; rect.Inflate((2 * min - rect.Width) / 2, y); rect.Offset(0,-PieHeight/2); rect.Inflate(-SliceMargin, -SliceMargin/2 ); return rect; } } public override Rectangle DisplayRectangle { get { Rectangle rect= base.DisplayRectangle; return new Rectangle(rect.X+Padding.Left, rect.Y+Padding.Top, rect.Width-Padding.Horizontal, rect.Height-Padding.Vertical); } } System.Windows.Forms.ToolTip toolTip1; public Pie3D() { InitializeComponent(); this.toolTip1 = new System.Windows.Forms.ToolTip(this.components); this.toolTip1.ToolTipIcon = System.Windows.Forms.ToolTipIcon.Info; m_PieSlices = new PieSlices(this); m_PieSlices.Inserted += new CollectionBase<PieSlice>.ItemEventHandler(m_PieSlices_Inserted); m_PieSlices.Removed += new CollectionBase<PieSlice>.ItemEventHandler(m_PieSlices_Removed); m_PieSlices.ItemPropertyChanged += new PropertyChangedEventHandler(m_PieSlices_ItemPropertyChanged); } void m_PieSlices_ItemPropertyChanged(object sender, PropertyChangedEventArgs e) { this.Refresh(); } void m_PieSlices_Removed(object sender, CollectionBase<PieSlice>.ItemEventArgs e) { this.Refresh(); } void m_PieSlices_Inserted(object sender, CollectionBase<PieSlice>.ItemEventArgs e) { this.Refresh(); } protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); //按最佳的绘制顺序取得饼块的绘制索引序列。 var items = from PieSlice ps in m_PieSlices let v = AbstractAngle(m_PieSlices.GetStartAngle(ps)) + m_PieSlices.GetSweepAngle(ps) /2 orderby Math.Abs((v < 90 ? v + 360 : v) - 270) select ps; foreach (PieSlice item in items) { //忽略颜色为透明呀空颜色 if (item.Color.IsEmpty || item.Color.A==0) continue; DrawPieSlice(e.Graphics, item, m_PieSlices.GetStartAngle(item), m_PieSlices.GetSweepAngle(item)); } } private void DrawPieSlice(Graphics g, PieSlice ps, float startAngle, float sweepAngle) { float start = Trans3D(startAngle); float endAngle = startAngle + sweepAngle; float end = Trans3D(endAngle); float sweep = end - start; if (sweep < 0) sweep += 360; float middle = start + sweep / 2; RectangleF rect = this.PieRectangle; rect.Offset((float)(SliceMargin * Math.Cos(middle * Math.PI / 180)), (float)(SliceMargin * Math.Sin(middle * Math.PI / 180))); GraphicsPath graphPath = new GraphicsPath(FillMode.Winding); graphPath.AddPie(rect.X, rect.Y, rect.Width, rect.Height, start, sweep); g.DrawPie(new Pen(ps.Color), rect, start, sweep); PointF[] pts = new PointF[]{ new PointF(rect.Left+rect.Width/2.0f,rect.Top+rect.Height/2), new PointF( rect.Left+rect.Width/2f+(float)(rect.Width/2 * Math.Cos(startAngle * Math.PI / 180)), rect.Top+rect.Height/2f+(float)(rect.Width/2 * Math.Sin(startAngle * Math.PI / 180)/2) ), new PointF( rect.Left+rect.Width/2f+(float)(rect.Width/2 * Math.Cos((endAngle) * Math.PI / 180)), rect.Top+rect.Height/2f+(float)(rect.Width/2 * Math.Sin((endAngle) * Math.PI / 180)/2) ) }; float absStart = AbstractAngle(start); float absEnd = AbstractAngle(end); if (absStart > 90 && absStart < 270) graphPath.AddPolygon(GetPolygon(pts[0], pts[1])); if (absEnd > 270 && absEnd <= 360 || absEnd >= 0 && absEnd <90) graphPath.AddPolygon(GetPolygon(pts[2], pts[0])); if ((absStart < 180) ^ (absEnd <180)) { if (absStart >=180) { graphPath.AddPolygon(GetPolygon(new PointF(rect.Right, rect.Top + rect.Height / 2), pts[2])); } else { graphPath.AddPolygon(GetPolygon(pts[1], new PointF(rect.Left, rect.Top + rect.Height / 2))); } } else { if (absEnd < absStart) { graphPath.AddPolygon(GetPolygon(pts[0], new PointF(rect.Left, rect.Top + rect.Height / 2))); graphPath.AddPolygon(GetPolygon(new PointF(rect.Right, rect.Top + rect.Height / 2), pts[0])); } else { if (absEnd < 180) graphPath.AddPolygon(GetPolygon(pts[1], pts[2])); } } foreach (PointF ptItem in pts) { PointF pt = new PointF(ptItem.X, ptItem.Y + PieHeight); g.DrawLine(new Pen(ps.Color), ptItem, pt); } if (absEnd < absStart) absEnd += 360; if (absStart < 180 && absEnd > 180) g.DrawLine(new Pen(ps.Color), new PointF(rect.Left, rect.Top + rect.Height / 2f), new PointF(rect.Left, rect.Top + rect.Height / 2f + PieHeight)); if ((absStart < 360 && absEnd > 360)) g.DrawLine(new Pen(ps.Color), new PointF(rect.Right, rect.Top + rect.Height / 2f), new PointF(rect.Right, rect.Top + rect.Height / 2f + PieHeight)); rect.Offset(0, PieHeight); graphPath.AddPie(rect.X, rect.Y, rect.Width, rect.Height, start, sweep); g.DrawPie(new Pen(ps.Color), rect, start, sweep); g.FillPath(new SolidBrush(Color.FromArgb((int)(255 * GradientRate / 100), ps.Color)), graphPath); graphPath.Dispose(); } protected override void OnMouseMove(MouseEventArgs e) { base.OnMouseMove(e); bool hitTesting = false; foreach (PieSlice item in m_PieSlices) { float startAngle = m_PieSlices.GetStartAngle(item); float sweepAngle = m_PieSlices.GetSweepAngle(item); float start = Trans3D(startAngle); float endAngle = startAngle + sweepAngle; float end = Trans3D(endAngle); float sweep = end - start; if (sweep < 0) sweep += 360; float middle = start + sweep / 2; RectangleF rect = this.PieRectangle; rect.Offset((float)(SliceMargin * Math.Cos(middle * Math.PI / 180)), (float)(SliceMargin * Math.Sin(middle * Math.PI / 180))); GraphicsPath graphPath = new GraphicsPath(FillMode.Winding); graphPath.AddPie(rect.X, rect.Y, rect.Width, rect.Height, start, sweep); if (graphPath.IsVisible(e.Location)) { toolTip1.Active = true; toolTip1.ToolTipTitle = item.Text + " [ " + item.Value + " (" + Math.Round(item.Value * 100 / m_PieSlices.Total,2).ToString() + "% )]"; toolTip1.Show(item.ToolTip, this,e.X+16,e.Y+16); hitTesting = true; break; } graphPath.Dispose(); } if (!hitTesting) toolTip1.Active = false; } float AbstractAngle(float angle) { if (angle < 0) return angle + 360; if (angle > 360) return angle - 360; return angle; } private PointF[] GetPolygon(PointF pt1, PointF pt2) { PointF _pt1 = pt1, _pt2 = pt2; _pt1.Y += PieHeight; _pt2.Y += PieHeight; return new PointF[] { pt1,_pt1 , _pt2, pt2 }; } private float Trans3D( float angle1) { float angle = AbstractAngle(angle1); if (angle == 90 || angle == 270) return angle1; double result = Math.Tan(angle1 * Math.PI / 180); result /= 2; float m = (float)(Math.Atan(result) / (Math.PI / 180)); if (angle > 0 && angle < 90) return m; else if (angle > 180 && angle < 270) return 180 + m; else if (angle > 90 && angle < 180) return 180 + m; else if (angle > 270 && angle < 360) return 360 + m; return angle1; } } public class PieSlices : CollectionBase<PieSlice> { public PieSlices(Pie3D pie) : base() { Pie = pie; } private Pie3D Pie; public double Total { get { double total = 0; foreach (PieSlice item in this) { total += item.Value; } return total; } } public float GetStartAngle(int index) { float sweep = Pie.CircumgyRate; for (int i = 0; i < index; i++) { sweep += GetSweepAngle(i); } return sweep; } public float GetStartAngle(PieSlice slice) { return GetStartAngle(IndexOf(slice)); } public float GetSweepAngle(int index) { return (float)(360 * (this[index].Value / this.Total)); } public float GetSweepAngle(PieSlice slice) { return GetSweepAngle(IndexOf(slice)); } } public class PieSlice : INotifyPropertyChanging, INotifyPropertyChanged { #region Value 属性定义 /// <summary> /// 当Value属性更改时发生。 /// </summary> public event EventHandler ValueChanged; /// <summary> /// 引发按控件的Value属性。 /// </summary> /// <param name="e">包含事件所需要数据的事件参数对象。</param> protected virtual void OnValueChanged(EventArgs e) { //如果控件的ValueChanged事件不为空且委托链长度大于0,则引发该事件。 if (ValueChanged != null && ValueChanged.GetInvocationList().Length > 0) { ValueChanged(this, e); } } private float m_Value = 0; /// <summary> /// 获取或设置对象的值。 /// </summary> [Category("扩展")] [Browsable(true)] [DefaultValue(typeof(float), "0")] [Description("获取或设置对象的值。")] public float Value { get { return m_Value; } set { if (m_Value == value) return; OnPropertyChanging(new PropertyChangingEventArgs("Value")); m_Value = value; OnPropertyChanged(new PropertyChangedEventArgs("Value")); OnValueChanged(new EventArgs()); } } #endregion #region Color 属性定义 /// <summary> /// 当Color属性更改时发生。 /// </summary> public event EventHandler ColorChanged; /// <summary> /// 引发按控件的Color属性。 /// </summary> /// <param name="e">包含事件所需要数据的事件参数对象。</param> protected virtual void OnColorChanged(EventArgs e) { //如果控件的ColorChanged事件不为空且委托链长度大于0,则引发该事件。 if (ColorChanged != null && ColorChanged.GetInvocationList().Length > 0) { ColorChanged(this, e); } } private Color m_Color = Color.Empty; /// <summary> /// 获取或设置对象的颜色。 /// </summary> [Category("扩展")] [Browsable(true)] [DefaultValue(typeof(Color), "Empty")] [Description("获取或设置对象的颜色。")] public Color Color { get { return m_Color; } set { if (m_Color.ToArgb() == value.ToArgb()) return; OnPropertyChanging(new PropertyChangingEventArgs("Color")); m_Color = value; OnPropertyChanged(new PropertyChangedEventArgs("Color")); OnColorChanged(new EventArgs()); } } #endregion #region Text 属性定义 /// <summary> /// 当Text属性更改时发生。 /// </summary> public event EventHandler TextChanged; /// <summary> /// 引发按控件的Text属性。 /// </summary> /// <param name="e">包含事件所需要数据的事件参数对象。</param> protected virtual void OnTextChanged(EventArgs e) { //如果控件的TextChanged事件不为空且委托链长度大于0,则引发该事件。 if (TextChanged != null && TextChanged.GetInvocationList().Length > 0) { TextChanged(this, e); } } private string m_Text = string.Empty; /// <summary> /// 获取或设置控件当前的文本。 /// </summary> [Category("扩展")] [Browsable(true)] [DefaultValue(typeof(string), "")] [Description("获取或设置控件当前的文本。")] public string Text { get { return m_Text; } set { if (m_Text == value) return; OnPropertyChanging(new PropertyChangingEventArgs("Text")); m_Text = value; OnPropertyChanged(new PropertyChangedEventArgs("Text")); OnTextChanged(new EventArgs()); } } #endregion #region ToolTip 属性定义 /// <summary> /// 当ToolTip属性更改时发生。 /// </summary> public event EventHandler ToolTipChanged; /// <summary> /// 引发按控件的ToolTip属性。 /// </summary> /// <param name="e">包含事件所需要数据的事件参数对象。</param> protected virtual void OnToolTipChanged(EventArgs e) { //如果控件的ToolTipChanged事件不为空且委托链长度大于0,则引发该事件。 if (ToolTipChanged != null && ToolTipChanged.GetInvocationList().Length > 0) { ToolTipChanged(this, e); } } private string m_ToolTip = string.Empty; /// <summary> /// 获取或设置对象的工具提示内容。 /// </summary> [Category("扩展")] [Browsable(true)] [DefaultValue(typeof(string), "")] [Description("获取或设置对象的工具提示内容。")] public string ToolTip { get { return m_ToolTip; } set { if (m_ToolTip == value) return; OnPropertyChanging(new PropertyChangingEventArgs("ToolTip")); m_ToolTip = value; OnPropertyChanged(new PropertyChangedEventArgs("ToolTip")); OnToolTipChanged(new EventArgs()); } } #endregion #region 构造函数重载列表 /// <summary> /// 构造函数,构造类型新实例。 /// </summary> /// <param name="value">饼块的值。</param> /// <param name="color">饼块的颜色。</param> /// <param name="text">饼块的文本。</param> /// <param name="toolTip">饼块的工具提示</param> public PieSlice(float value, Color color, string text, string toolTip) { Value = value; Color = color; Text = text; ToolTip = toolTip; } /// <summary> /// 构造函数,构造类型新实例。 /// </summary> /// <param name="value">饼块的值。</param> /// <param name="color">饼块的颜色。</param> /// <param name="text">饼块的文本。</param> public PieSlice(float value, Color color, string text) : this(value, color, text, "") { } /// <summary> /// 构造函数,构造类型新实例。 /// </summary> /// <param name="value">饼块的值。</param> /// <param name="color">饼块的颜色。</param> public PieSlice(float value, Color color) : this(value, color, "") { } /// <summary> /// 构造函数,构造类型新实例。 /// </summary> public PieSlice() : this(0, Color.Empty) { } #endregion #region INotifyPropertyChanging 成员 /// <summary> /// 当前对象任一属性更改时发生,优先于属性更改通知(如果有)。 /// </summary> public event PropertyChangingEventHandler PropertyChanging; #endregion /// <summary> /// 引发PropertyChanging事件。 /// </summary> /// <param name="e">为PropertyChanging提供事件数据的PropertyChangingEventArgs。</param> void OnPropertyChanging(PropertyChangingEventArgs e) { if (PropertyChanging != null && PropertyChanging.GetInvocationList().Length > 0) { PropertyChanging(this, e); } } #region INotifyPropertyChanged 成员 /// <summary> /// 当前对象任一属性已更改后发生,优先于属性已更改通知(如果有)。 /// </summary> public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged; #endregion /// <summary> /// 引发PropertyChanged事件。 /// </summary> /// <param name="e">为PropertyChanged提供事件数据的PropertyChangedEventArgs。</param> void OnPropertyChanged(PropertyChangedEventArgs e) { if (PropertyChanged != null && PropertyChanged.GetInvocationList().Length > 0) { PropertyChanged(this, e); } } public override string ToString() { return this.Text + "[" + Value.ToString() + "]"; } } }

转载于:https://www.cnblogs.com/free-coder/archive/2009/12/17/2171264.html

最近刚写的——三维饼图相关推荐

  1. R语言绘图学习1(pairs,cpairs,饼图,三维饼图,高密度散点图,三维图,旋转三维图)

    本人正在学习R语言,像利用这个平台记录自己一些自己的学习情况,方便以后查找,也想分享出来提供一些资料给同样学习R语言的同学们.(如果内容有错误,欢迎大家批评指正) 1.pairs和cpairs的区别 ...

  2. 【趣图】测试刚写完的代码...

    1.被老板委派接手刚刚离职同事的项目... 2.当他们要求我测试所有应用功能时 3.准备下班的时候,测试又提bug过來了- 4.使用新框架却忘记阅读文档 5.测试实习生的代码 6.网络延迟的危害.. ...

  3. 往事回忆记得刚写飞鸽传书的时候

    记得刚写飞鸽传书的时候,刚毕业的那会儿,不知道做什么工作,甚至面试过期货操盘手.地产中介 .农药销售人员等职位.大学毕业后,有三个同学租了一个城乡结合部的复式房子的20平米客厅.另有六个同学听说此事, ...

  4. 刚写完的商城erp + 这个商城前台,新鲜出炉。自己1个人写, 包括php框架和前端html页面....

    刚写完的商城erp + 这个商城前台,新鲜出炉.自己1个人写, 包括php框架和前端html页面. 刚写完的商城erp + 这个商城前台,新鲜出炉.自己1个人写, 包括php框架和前端html页面. ...

  5. 第4章第16节:图表:使用三维饼图制作年度销售额图表 [PowerPoint精美幻灯片实战教程]

    您将在本节制作一份具有立体感的三维饼图.首先点击插入选项卡,显示插入功能面板. 点击插入功能面板中的图表命令,打开插入图表窗口. 在左侧的图表类型列表中,选择饼图. 然后在饼图类型列表中,选择三维饼图 ...

  6. 【MATLAB】进阶绘图 ( Pie Chart 饼图 | pie 函数 | 三维饼图 | pie3 函数 )

    文章目录 一.Pie Chart 饼图 1.pie 函数 2.pie3 函数 3.饼图示例 一.Pie Chart 饼图 1.pie 函数 pie 函数文档 : https://ww2.mathwor ...

  7. 刚写完排序算法,就被开除了…

    刚写完这段代码,就被开除了-- 栈长前些天刚写完上面这篇文章,没几天,又来一个悲剧... 据说是一个月薪 9K 的 Java 程序员,因老板让他写一个排序算法,然后他就写了一段屌炸天的休眠排序算法,接 ...

  8. 程序员刚写完代码 , 就被开除了,网友笑到抽筋

    程序员这行业可能对于一般人来说,你不入这行,是不懂行里的门道的.互联网行业的迅猛发展,很多人都选择加入到程序员这个群体中来,现在很多人都说该行业呈饱和状态,毕竟一年百万级的程序员加入进来. 一般程序员 ...

  9. 如何在前端用js实现画三维饼图和三维柱形图

    echarts没有三维饼图,但是有时候又需要在前端绘制三维饼图怎么办?这个时候可以考虑用threejs来实现功能. 现在我们来实现图示效果:         1:首先在项目里引入threejs文件 t ...

最新文章

  1. 最落寞的C9高校:从未没落
  2. 用python处理excel数据的优势-python处理excel的优势是什么
  3. bootstrap 标签页tab切换js(含报错原因)
  4. DayDayUp:今天早上看到一条朋友圈——《吃苦与穷的深刻认知》
  5. 大型网站技术架构(一)大型网站架构演化
  6. 腾讯竞购ICQ或失败!
  7. python获取windows路径,Python中的Windows路径
  8. 今天被公司安排给候选者进行初面,分享我的6道面试题
  9. 线性回归的梯度下降和正规方程组求解
  10. 游戏机制新设计工具(Machinations)工作原理
  11. UTF8下的中文截取
  12. 亚马逊表示并未放弃WP平台:正在打造新应用
  13. mac系统下为emacs设置中文字体,解决乱码问题
  14. 没有编程基础可以学python_没有任何编程基础可以直接学习python语言吗?学会后能够做什么?...
  15. Struts2入门教程(学习教程资料).pdf
  16. 27.3. Directory and File System Related
  17. 塞班手机刷linux,向 诺基亚 塞班手机中 批量导入 通讯录(csplit iconv)
  18. matlab神经网络训练图解释,matlab实现神经网络算法
  19. 【今日CV 计算机视觉论文速览 第150期】Fri, 2 Aug 2019
  20. MFC:读取整个记事本文件

热门文章

  1. 25-60k/m | 湃道智能招聘
  2. 美国IARPA发起人脸识别算法融合大奖赛
  3. mingw64 下 java_Win7 64 配置MinGW,以及使用Eclipse
  4. 连续七天熬夜3D建模师终于出手,让老板增加薪资待遇,分享使用3D建模软件的6个行业
  5. PyTorch | 通过torch.eye创建单位对角矩阵 | torch.eye()如何使用?torch.eye()例子 | torch.eye()使用方法
  6. NeurIPS | 17篇论文带你展望图机器学习发展趋势
  7. 如何准确估计机器人的状态,增强机器人控制的精度及稳定性
  8. Could not find module ‘D:\codna\Library\bin\geos_c.dll‘
  9. 你听过算法也是可以贪心的吗?
  10. 百度地图显示服务器地址,百度地图_根据地图上标记位置获取街道信息,以及经纬度信息...