Plasma effect: Difference between revisions
Content added Content deleted
(Scala contribution added.) |
|||
Line 1,245: | Line 1,245: | ||
https://www.dropbox.com/s/gdioouv328m2d60/PlasmaEffect.jpg?dl=0 |
https://www.dropbox.com/s/gdioouv328m2d60/PlasmaEffect.jpg?dl=0 |
||
=={{header|Scala}}== |
|||
===Java Swing Interoperability=== |
|||
<lang Scala>import java.awt._ |
|||
import java.awt.event.ActionEvent |
|||
import java.awt.image.BufferedImage |
|||
import javax.swing._ |
|||
import scala.math.{sin, sqrt} |
|||
object PlasmaEffect extends App { |
|||
SwingUtilities.invokeLater(() => |
|||
new JFrame("Plasma Effect") { |
|||
class PlasmaEffect extends JPanel { |
|||
private val (w, h) = (640, 640) |
|||
private var hueShift = 0.0f |
|||
override def paintComponent(gg: Graphics): Unit = { |
|||
val g = gg.asInstanceOf[Graphics2D] |
|||
def drawPlasma(g: Graphics2D) = { |
|||
val img = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB) |
|||
for (y <- 0 until h; |
|||
x <- 0 until w) { |
|||
def design = |
|||
(sin(x / 16f) + sin(y / 8f) + sin((x + y) / 16f) + sin(sqrt(x * x + y * y) / 8f) + 4).toFloat / 8 |
|||
img.setRGB(x, y, Color.HSBtoRGB(hueShift + design % 1, 1, 1)) |
|||
} |
|||
g.drawImage(img, 0, 0, null) |
|||
} |
|||
super.paintComponent(gg) |
|||
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON) |
|||
drawPlasma(g) |
|||
} |
|||
// animate about 24 fps and shift hue value with every frame |
|||
new Timer(42, (_: ActionEvent) => { |
|||
hueShift = (hueShift + 0.02f) % 1 |
|||
repaint() |
|||
}).start() |
|||
setBackground(Color.white) |
|||
setPreferredSize(new Dimension(h, w)) |
|||
} |
|||
add(new PlasmaEffect, BorderLayout.CENTER) |
|||
pack() |
|||
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE) |
|||
setLocationRelativeTo(null) |
|||
setResizable(false) |
|||
setVisible(true) |
|||
}) |
|||
}</lang> |
|||
=={{header|Sidef}}== |
=={{header|Sidef}}== |
||
{{trans|Perl 6}} |
{{trans|Perl 6}} |