PNG Pixel Forces

8

masukkan deskripsi gambar di sini

Tantangan

A Pixel World adalah gambar PNG di mana gaya gravitasi, elektromagnetik, dan nuklir tidak ada lagi. Pasukan khusus yang dikenal sebagai "kekuatan piksel" adalah yang tersisa. Kami mendefinisikan kekuatan ini sebagai

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

  • Fadalah kekuatan piksel yang pdiberikan padaq
  • a adalah konstanta Adams, didefinisikan sebagai a = 4.2 * 10 ^ 1
  • pdan qdikenakan biaya pada dua piksel
  • radalah jarak dari pkeq
  • adalah arah r dalam radian, diukur berlawanan arah jarum jam * dari sumbu x positif

* Ada banyak nilai yang tidak dapat diterima untuk setiap arah. Misalnya, radian 6.28, 0, -6.28, dan -12.57 semuanya setara, dan semuanya akan diterima.

Ada tiga jenis piksel:

  • Pixel merah memiliki muatan positif
  • Sebuah piksel hitam memiliki muatan negatif
  • Pixel putih memiliki muatan nol

Piksel kiri bawah dunia piksel terletak di (0, 0). Sumbu y positif jatuh ke atas halaman, dan sumbu x positif jatuh ke kanan. Total gaya pada piksel hanyalah jumlah vektor dari semua gaya yang diberikan pada piksel tersebut. Seperti biaya mengusir, dan biaya berlawanan menarik.

Diberikan jalur file ke Dunia Pixel, serta dua bilangan bulat xdan y, output gaya total yang diberikan pada piksel di lokasi (x, y)dalam format <magnitude>\n<direction>. Output harus akurat setidaknya 2 tempat desimal, tetapi Anda dapat menghasilkan lebih banyak jika Anda inginkan. Arah harus berupa output dalam radian. Bilangan bulat xdan ydijamin berada dalam batas dunia.

Kiriman

Anda harus memasukkan program, dan perintah yang dapat digunakan untuk menjalankan program Anda. Dua contoh:

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

Contoh Gambar

Pada gambar di bawah , ada piksel hitam di (100, 104).

Pixars.png

masukkan deskripsi gambar di sini

Contoh Output

Output ini tidak sesuai dengan input di atas.

534.19721014
4.32605416

Perlu bantuan untuk memulai?

Saya menulis beberapa kode contoh di sini . Saya belum mengujinya, jadi gunakan dengan risiko Anda sendiri.

Rainbolt
sumber
Bisakah itu PPM, bukan PNG? dan biasanya, gambar menempatkan 0,0 di sudut kiri atas, apakah kita harus memutarnya?
user137
@ user137 Setiap orang harus menangani format gambar PNG. Saya sedang mempertimbangkan untuk memposting beberapa kode Java untuk memulai. Saya tidak ingin mulai menambahkan persyaratan opsional. Kiri bawah dipilih sebagai (0,0) karena ini memungkinkan kita untuk menggunakan sistem koordinat kanan dan mengukur radian berlawanan arah jarum jam dari sumbu x positif. Jika kita menempatkan (0,0) di kiri atas, dan radian akan diukur searah jarum jam dari sumbu x positif. Tidak masalah ke mana Anda melakukannya, beberapa standar sayangnya akan rusak. Tidak bisakah Anda hanya membalik gambar?
Rainbolt
2
Saya suka gambar intro ...
trichoplax
Saya pikir pilihan untuk PNG benar-benar akan menahan orang, kecuali mereka yang memiliki pengetahuan tentang Jawa - yang, sejauh yang saya tahu, adalah satu-satunya bahasa dengan sesuatu seperti ImageIO. C ++, misalnya, tidak memilikinya.
tomsmeding
Tantangan yang bagus. PNG adalah IMO baik-baik saja. Btw, berikut adalah beberapa pertanyaan yang saya miliki saat mencobanya. 1. Saya tidak yakin apakah ini saya, tapi sepertinya saya tidak dapat menemukan piksel hitam dalam (99.101) pada gambar. 2. Apakah contoh menampilkan jawaban untuk gambar uji? 3. Untuk arah, jika sudutnya <pi derajat searah jarum jam dari sumbu + ve x, apakah nilai negatif (yaitu 0 <Sudut <pi) diizinkan, atau haruskah (pi <Sudut <2 * pi)?
Vectorized

Jawaban:

2

Python - 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]

Tidak disatukan

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]

Beberapa program kecil yang digunakan untuk membuat tes:

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

Tes sampel:

masukkan deskripsi gambar di sini

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

masukkan deskripsi gambar di sini

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

masukkan deskripsi gambar di sini

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

Posting saja dulu ... Jika ada kesalahan atau masalah, berikan komentar di bawah ini, tetapi mungkin akan memakan waktu cukup lama untuk merespons karena saya benar-benar sibuk dengan hal-hal lain.

Vektor
sumber
2
Saya suka program tes! Ini jauh lebih baik daripada memperbesar 400% pada gambar kecil, membuat titik-titik dengan tangan, lalu mencoba merekam lokasi semua titik-titik kecil. Anda harus menjadi seorang programmer!
Rainbolt