Lực lượng pixel PNG


8

nhập mô tả hình ảnh ở đây

Thử thách

Thế giới Pixel là một hình ảnh PNG nơi các lực hấp dẫn, điện từ và hạt nhân không còn tồn tại. Các lực lượng đặc biệt được gọi là "lực lượng pixel" là tất cả những gì còn lại. Chúng tôi định nghĩa lực lượng này là

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

  • Flà lực pixel ptác động lênq
  • a là hằng số của Adams, được định nghĩa là a = 4.2 * 10 ^ 1
  • pqđược tính phí trên hai pixel
  • rlà khoảng cách từ pđếnq
  • là hướng của r tính bằng radian, được đo ngược chiều kim đồng hồ * từ trục x dương

* Có vô số giá trị chấp nhận được cho bất kỳ hướng nào. Ví dụ: radian 6.28, 0, -6.28 và -12.57 đều tương đương và tất cả sẽ được chấp nhận.

Ba loại pixel tồn tại:

  • Một pixel màu đỏ giữ một điện tích dương
  • Một pixel đen giữ một điện tích âm
  • Một pixel trắng giữ điện tích bằng không

Pixel dưới cùng bên trái của thế giới pixel nằm ở (0, 0). Trục y dương rơi xuống trang và trục x dương rơi sang phải. Tổng lực trên một pixel chỉ đơn giản là tổng vectơ của tất cả các lực tác dụng lên pixel đó. Giống như phí đẩy lùi, và phí ngược lại thu hút.

Đưa ra một đường dẫn tệp đến Thế giới Pixel, cũng như hai số nguyên xy, xuất ra tổng lực tác dụng lên pixel tại vị trí (x, y)theo định dạng <magnitude>\n<direction>. Đầu ra phải chính xác đến ít nhất 2 chữ số thập phân, nhưng bạn có thể xuất nhiều hơn nếu bạn muốn. Hướng phải là đầu ra tính bằng radian. Các số nguyên xyđược đảm bảo trong phạm vi thế giới.

Sản phẩm bàn giao

Bạn phải bao gồm một chương trình và một lệnh có thể được sử dụng để chạy chương trình của bạn. Hai ví dụ:

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

Hình ảnh ví dụ

Trong hình ảnh bên dưới , có một pixel màu đen tại (100, 104).

Pixars.png

nhập mô tả hình ảnh ở đây

Ví dụ đầu ra

Đầu ra này không tương ứng với đầu vào trên.

534.19721014
4.32605416

Cần giúp đỡ để bắt đầu?

Tôi đã viết một số mã ví dụ ở đây . Tôi đã không kiểm tra nó, vì vậy sử dụng nó có nguy cơ của riêng bạn.


Nó có thể là PPM thay vì PNG? và thông thường, hình ảnh đặt 0,0 ở góc trên cùng bên trái, chúng ta có phải xoay nó không?
dùng137

@ user137 Mọi người phải xử lý định dạng hình ảnh PNG. Tôi đang xem xét đăng một số mã Java để bắt đầu mọi người. Tôi không muốn bắt đầu thêm các yêu cầu tùy chọn. Phía dưới bên trái được chọn là (0,0) vì điều này cho phép chúng ta sử dụng hệ tọa độ tay phải và đo radian ngược chiều kim đồng hồ từ trục x dương. Nếu chúng ta đặt (0,0) ở trên cùng bên trái và radian sẽ được đo theo chiều kim đồng hồ từ trục x dương. Cho dù bạn làm theo cách nào, một số tiêu chuẩn sẽ không may bị phá vỡ. Bạn không thể lật hình ảnh nào?
Rainbolt

2
Tôi thích hình ảnh giới thiệu ...
trichoplax

Tôi nghĩ rằng sự lựa chọn cho PNG sẽ thực sự kìm hãm mọi người, ngoại trừ những người có kiến ​​thức sẵn sàng về Java - mà theo như tôi biết, là ngôn ngữ duy nhất có thứ gì đó như ImageIO. C ++, đối với một, không có nó.
tomsmeding

Thử thách đẹp. PNG là IMO tốt. Btw, đây là một số câu hỏi tôi có trong khi thử nó. 1. Tôi không chắc đó có phải là tôi không, nhưng dường như tôi không thể tìm thấy pixel đen trong (99.101) trong ảnh. 2. Là ví dụ đầu ra là câu trả lời cho hình ảnh thử nghiệm? 3. Đối với hướng, nếu góc <pi độ theo chiều kim đồng hồ từ trục + ve x, thì giá trị âm (nghĩa là 0 <Góc <pi) được phép hay phải là (pi <Góc <2 * pi)?
Vectorized

Câu trả lời:


2

Con trăn - 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]

Ung dung

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]

Một số chương trình nhỏ được sử dụng để tạo các bài kiểm tra:

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

Xét nghiệm mẫu:

nhập mô tả hình ảnh ở đây

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

nhập mô tả hình ảnh ở đây

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

nhập mô tả hình ảnh ở đây

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

Chỉ cần đăng bài đầu tiên ... Nếu có bất kỳ sai lầm hoặc vấn đề nào, hãy bình luận xuống bên dưới, nhưng có lẽ sẽ mất khá nhiều thời gian để trả lời vì tôi thực sự bận rộn với những thứ khác.


2
Tôi yêu chương trình thử nghiệm! Nó tốt hơn nhiều so với phóng to 400% trên một hình ảnh nhỏ, tạo các chấm bằng tay, sau đó cố gắng ghi lại vị trí của tất cả các chấm nhỏ. Bạn phải là một lập trình viên!
Rainbolt
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.