PNGピクセルフォース


8

ここに画像の説明を入力してください

チャレンジ

Pixel Worldは、重力、電磁気、および核力が存在しないPNG画像です。「ピクセルフォース」として知られる特殊部隊は残りすべてです。この力を次のように定義します

F p-> q = a *(p * q)/(r * r)* r̂

  • Fピクセル力であるp及ぼすにはq
  • a アダムスの定数で、次のように定義されます a = 4.2 * 10 ^ 1
  • pそしてq二つの画素の電荷です
  • r以下からの距離pには、q
  • r̂ 正のx軸から反時計回りに測定したラジアン単位のrの方向です*

*どの方向にも許容値は無限にあります。たとえば、6.28、0、-6.28、および-12.57ラジアンはすべて同等であり、すべて受け入れられます。

ピクセルには次の3つのタイプがあります。

  • 赤いピクセルは正のピクセルの電荷を保持します
  • 黒いピクセルは負のピクセルの電荷を保持します
  • 白いピクセルはゼロの電荷を保持します

ピクセルワールドの左下のピクセルはにあり(0, 0)ます。正のy軸はページの上に下がり、正のx軸は右に下がります。ピクセルに加わる力の合計は、そのピクセルに加えられたすべての力のベクトルの合計です。電荷が反発するように、反対の電荷が引き寄せられます。

ピクセルワールドへのファイルパス、xおよび2つの整数とを指定するとy、位置にあるピクセルに加えられた力の合計(x, y)がフォーマットで出力されます<magnitude>\n<direction>。出力は少なくとも小数点以下2桁まで正確でなければなりませんが、必要に応じてさらに出力することもできます。方向はラジアンで出力する必要があります。整数xとyは、世界の境界内にあることが保証されています。

成果物

プログラムと、プログラムの実行に使用できるコマンドを含める必要があります。2つの例:

python AbsolutelyPositive.py "C:\ Pixtona.png" 50 40
java UltimateAttraction "C:\ Jupix.png" 30 30

画像の例

下の画像では、に黒いピクセルがあり(100, 104)ます。

Pixars.png

ここに画像の説明を入力してください

出力例

この出力は上記の入力に対応していません。

534.19721014
4.32605416

始めるために助けが必要ですか?

ここにいくつかのサンプルコードを書きました。私はテストしていませんので、自己責任で使用してください。


PNGではなくPPMにすることはできますか?通常、画像は左上隅に0,0を配置しますが、回転させる必要がありますか?
— user137 14

@ user137全員がPNG画像形式を処理する必要があります。人々が始められるようにJavaコードを投稿することを検討しています。オプションの要件の追加を開始したくありません。左下が(0,0)として選択されたのは、これにより、右手座標系を使用して、正のx軸から反時計回りにラジアンを測定できるためです。左上に(0,0)を配置すると、ラジアンは正のx軸から時計回りに測定されます。どの方法を使用しても、一部の標準は残念ながら破られます。とにかく画像をめくってみませんか?
— Rainbolt 2014

2
私はイントロの写真が大好きです
— trichoplax 14

私が知っている限り、ImageIOのようなものを備えた唯一の言語であるJavaの知識がある人を除いて、PNGの選択は本当に人々を引き留めると思います。たとえば、C ++にはありません。
— tomsmeding 2014

いい挑戦だ。PNGはすばらしいIMOです。さて、ここに私がそれを試みている間に私が持っているいくつかの質問があります。1.自分かどうかはわかりませんが、画像の(99,101)にある黒いピクセルが見つかりません。2.例では、テストイメージの回答を出力していますか?3.方向について、角度が+ ve x軸から時計回りに<pi度の場合、負の値(つまり、0 <角度<pi)が許可されますか、それとも(pi <角度<2 * pi)でなければなりませんか?
— 2014

回答:


2

パイソン-355

import sys,Image,math as m
i=Image.open(sys.argv[1])
w,h=i.size
a=i.load()
X,Y=map(int,sys.argv[2:])
t=m.atan2
c=lambda i,j:2*(a[i,j][0]>200)-(a[i,j][1]>200)-1
p=c(X,h-1-Y)
V=H=0
for j in range(h):
 for i in range(w):q=c(i,h-1-j);y=Y-j;x=X-i;r=x*x+y*y;f=r and 42.*p*q/r;V+=m.cos(t(x,y))*f;H+=m.sin(t(x,y))*f
d=t(V,H)
print(V**2+H**2)**.5,[d,m.pi*2+d][d<0]

未ゴルフ

import sys
import Image
import math as m

X,Y=map(int,sys.argv[2:]) # The X and Y coordinates of the test pixel

i=Image.open(sys.argv[1]) # Open the image
w,h=i.size # Get the width and height of the image
a=i.load() # Get a pixel access object of the image
V=0 # V = vector sum of Vertical Forces
H=0 # H = vector sum of Horizontal Forces

# Function to calculate the charge of the a pixel at x=i, y=j
def c(i,j):
    global a
    if a[i,j][0]>200: # If Red > 200
        if a[i,j][2]>200: # If Green > 200
            return 0 # We assume that pixel is White
        else:
            return 1 # We assume that pixel is Red
    return -1 # Else, we asusme that pixel is Black

p=c(X,h-1-Y) # Assign the charge of the test pixel to p

for j in range(h): # For every y value...
    for i in range(w): # For every x value...
        q=c(i,h-1-j) # Assign the charge of the current pixel to q
        y=Y-j # The y distance of the test pixel from the current pixel
        x=X-i # The x distance of the test pixel from the current pixel
        rSquared=x*x+y*y # The r-squared distance between the 2 pixels
        f=rSquared and 42.*p*q/rSquared # If rSquared is > 0, calculate the force. 
                                        # Otherwise, the force is zero
        V+=m.cos(m.atan2(x,y))*f # Add the Y component of the force to V
        H+=m.sin(m.atan2(x,y))*f # Add the X component of the force to H

d=m.atan2(V,H)
print(V**2+H**2)**.5,[d,m.pi*2+d][d<0]

テストを作成するために使用されるいくつかの小さなプログラム:

import Image
width  = 100 # Define your own image width
height = 100 # Define your own image height
image = Image.new("RGB", (width, height), "white")
pixels = image.load()
blacks = [(0,0), (1,1)] # Define your own black pixels
reds   = [(0,1), (1,0)] # Define your own red pixels
for x,y in blacks:
    pixels[x,height-1-y] = (0,0,0)
for x,y in reds:
    pixels[x,height-1-y] = (255,0,0)
image.save("y.png") # Save image

サンプルテスト:

ここに画像の説明を入力してください

Users-MacBook-Air:pngforces User$ python z3.py y.png 0 0
59.3969696197 0.785398163397

ここに画像の説明を入力してください

Users-MacBook-Air:pngforces User$ python z3.py y.png 50 50
0.0084 3.92699081699

ここに画像の説明を入力してください

Users-MacBook-Air:pngforces User$ python z3.py y.png 50 50
0.0084 0.785398163397

最初に投稿するだけです...間違いや問題がある場合は、コメントを下にドロップしてください。ただし、他のことで忙しいので、返答にかなりの時間がかかります。


2
私はテストプログラムが大好きです!小さな画像を400%拡大して手動でドットを作成し、すべての小さなドットの位置を記録するよりもはるかに優れています。あなたはプログラマーでなければなりません!
— Rainbolt 2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.