【问题标题】:java How to set vertical gradientpaint for heat/tempjava如何为热量/温度设置垂直梯度绘制
【发布时间】:2013-11-11 14:41:35
【问题描述】:

您好,我正在尝试用温度填充矩形 (300,30)。

像下面的任何一个垂直条。

我正在尝试:

GradientPaint gp2 = new GradientPaint(0, 0, 
                      Color.RED, 0, 300, Color.YELLOW, true);

我不理解文档中的 Point1 到 Point2 部分。

这些要点是什么?我如何找到它们来填充矩形或 GradientPainting 面板的背景?

【问题讨论】:

  • 你的代码看起来是正确的,你有什么问题?

标签: java gradient


【解决方案1】:

渐变绘制使用 2 个点及其各自的颜色。例如,它的工作方式与 Inkscape 中的渐变工具完全相同。

假设这些点是 A 和 B。现在想象一条从 A 到 B 的线。这条线的点的颜色范围从 A 的颜色到 B 的颜色。顺便说一下,它们的范围是线性的。

如果 A 是黑色 (0,0,0) 而 B 是白色 (255, 255, 255),那么从 A 到 B 中间的点将具有它的颜色 (127, 127, 127),因为 127 = (0 + 255)/2(整数)。

A 之前和 B 之后的点将分别具有 A 和 B 的颜色。看图:

( color of A )(color between A and B)( color of B)
-------------A-----------------------B------------

现在平面上所有其他点的颜色呢?假设 D 不在 A 到 B 的直线上。首先你需要找到 D 在 A 到 B 的直线上的投影。假设投影是点 E。如果 E 在 A 和 B 之间,则 D 的颜色将使用线性范围作为 E 的颜色。

这就是它的工作原理。现在,您似乎需要做一些比这更复杂的事情。您将需要创建自己的方法来计算每个像素的颜色。标准 Java2D 无法帮助您。

也许您的困惑来自 A 和 B 不是唯一的事实。很难用语言解释,但我会努力的。混淆是因为我们实际上并不需要两个点来定义渐变。我们可以简单地给出渐变原点(点 A)、角度和长度,直到颜色变为第二种颜色。想一想应用于点 A 的距离矢量。但我们不要用抽象的术语来思考,或者事情会如何。让我们简单地解决您的问题。

Java2D 中的渐变绘制作为 Inkscape 中的线性疼痛:http://vector.tutsplus.com/tutorials/tools-tips/quick-tip-how-to-create-gradient-fills-and-on-stroke-in-inkscape/

看这张图片:

小正方形是 A,小矩形是 B。现在如果我将 A 和 B 都向上移动相同的距离会发生什么?我们将这些新点称为 A' 和 B'。 A' 和 B' 仍将定义一条水平线。渐变将完全相同。当我说解决方案不是唯一的时,这就是我的意思。事实上,有无数个点可以为您提供相同的渐变(当然,在实践中,数量受屏幕上像素数的限制)。

那么问题大概是:A和B怎么选?答案是:任何对你来说更方便的。一本让概念更清晰的小食谱:

  • 垂直梯度:A = (x, y); B = (x, y + deltaY)。其中 deltaY 是颜色变化区域的高度。无论 y,梯度都是一样的。
  • 水平梯度:A = (x, y); B = (x + deltaX, y)。其中 deltaX 是颜色变化区域的宽度。无论 y,梯度都是一样的。
  • 对角梯度,45度:A = (x, y); B = (x + delta, y + delta)。其中 delta 是正方形的边,其对角线是颜色变化的线。

在上面的最后一项中,x 和 y 都很重要,但仍然不是唯一的。如果进行以下变换,可以获得相同的梯度: A = (x + 噪声,y - 噪声); B = (x + delta + 噪声,y + delta - 噪声),其中噪声为任意整数。

如果解释还不清楚,请告诉我,以便我再试一次。

【讨论】:

  • 感谢您的完整回答。然而,我的主要困惑是:A 和 B 点是什么?如果我想 GraientPaint 一个矩形,我应该使用什么 A 和 B?或者,如果我想对面板进行渐变绘制,我再次使用什么“点”。这就是我遇到的麻烦。
  • 刚刚在我的回答中添加了更多内容。如果现在解释清楚了,请告诉我。
  • "Java(以及大多数计算机系统)中坐标系的约定是屏幕的左上角是原点。当然,我们以像素为单位测量,x 轴是水平从左上到右。y 轴从左上开始垂直向下。" courses.cs.washington.edu/courses/cse331/11wi/sections/…
  • 是的,没错。这是自古以来的约定。至少据我记得在屏幕上绘制点。但我认为问题不是“给定一个点(x,y),屏幕上的点在哪里”。我认为问题在于我们定义渐变时这些点的作用。正如我所说,主要困难在于这些点不是唯一定义的。老实说,我认为在几何上使用角度会更有意义。但我们也需要考虑到实际的方面。
  • @Akira - 感谢您提供额外信息。你是说我需要知道我的“形状”的 TL 和 BR 的坐标才能创建这个渐变?这些点是绝对的屏幕坐标吗?所以如果我想用 w=300,h=200 填充一个矩形。我实际上必须知道它将在屏幕上的哪个位置开始绘制?
猜你喜欢
  • 1970-01-01
  • 2016-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-14
  • 2019-02-26
相关资源
最近更新 更多