Mostrando postagens com marcador sin. Mostrar todas as postagens
Mostrando postagens com marcador sin. Mostrar todas as postagens

terça-feira, 14 de novembro de 2017

Séries de Taylor - Seno

Aqui um exercício de implementação de um algoritmo para o cálculo do Seno de um ângulo através de uma série de Taylor.

Na implementação, estamos fixando as iterações em 20 e o arredondamento em 10 casas decimais. Observa-se a função de apoio Fatorial, a mesma que implementamos no post sobre recursividade.
Function Fatorial([Int32]$num) {
    if ($num -eq 0) { return 1 }
    return $num * (Fatorial($num-1))
}

Function Seno($x,$max) {
    $senoX = $x - ([math]::Pow($x,3) / (Fatorial 3))
    For ($n=2;$n -lt $max;$n++) {
        $senoX = $senoX + [math]::Pow(-1,$n)*[math]::Pow($x,(2*$n+1)) / (Fatorial (2*$n+1))
    }
    Return $senoX 
}

Clear-Host
$angulo = Read-Host "Digite um ângulo para calcular o Seno"
$rad = $angulo / 180 * [math]::PI
$seno = [math]::Round((Seno $rad 20),10)
Write-Host -ForeGroundColor Yellow "Seno($angulo°)=$seno"

segunda-feira, 30 de outubro de 2017

Desenhando linhas com efeito gradiente

Aqui vamos demonstrar como explorar um efeito gradiente na composição da cor de uma linha.

Para tanto, precisamos dos seguintes componentes principais:
  • Definimos form.CreateGraphics
  • Definimos 2 pontos p1 e p2 para traçar a linha
  • Criamos o objeto LinearGradientBrush
  • Criamos o objeto pen
  • Traçamos a linha
[System.Drawing.Graphics]$g = $f.CreateGraphics()
$lgb = New-Object System.Drawing.Drawing2D.LinearGradientBrush($p1, $p2, $c1, $c2)
$pen = New-Object System.Drawing.Pen($lgb)
$g.DrawLine($pen, $p1, $p2)


Nesse exemplo de código, estaremos traçando linhas a partir de um ponto central a todos os 360º de um círculo. Cada linha terá o efeito gradiente com as cores verde e azul. O código é o seguinte:
[reflection.assembly]::LoadWithPartialName( "System.Windows.Forms")
[reflection.assembly]::LoadWithPartialName( "System.Drawing")
[System.Windows.Forms.Application]::EnableVisualStyles();

Function line([Int32]$val,[String]$c1,[String]$c2) {
    $ang = $val * ([math]::PI/180) ## em Radianos
    $r=150 ## tamanho da linha
    [System.Drawing.Graphics]$g = $f.CreateGraphics()   
    $p1 = New-Object System.Drawing.Point(190, 180)
    $p2 = New-Object System.Drawing.Point((190+$r*[math]::Cos($ang)), (180+$r*[math]::Sin($ang)))
    $lgb = New-Object System.Drawing.Drawing2D.LinearGradientBrush($p1, $p2, $c1, $c2)
    $pen = New-Object System.Drawing.Pen($lgb)
    $g.DrawLine($pen, $p1, $p2)
    $g.Dispose()
}

$f = New-Object Windows.Forms.Form
$f.Width = 400
$f.Height = 400
$f.Show()
$f.Refresh()

for ([Int32]$angulo=0;$angulo -lt 360;$angulo++) {
    line $angulo 'Green' 'Blue'
    Start-Sleep -Milliseconds 50
}

Start-Sleep -s 5
$f.Close()
$f.Dispose()

Segue o resultado: